2016-08-28 4 views
0

배열을 반환해야하는 함수를 작성하고 있습니다. 함수에서 함수에서 반환하려는 항목의 유형을 결정하는 일부 논리가 있습니다. 나는 내 문제를 해결하는 방법을 알아 내려고 노력하고,스위프트 일반 배열을 특정 유형

"cannot invoke append with an argument list of type '(String)', 
and 
"cannot invoke append with an argument list of type '(Int)' 

그것은 의미가 있지만 :

func testFunc<T>(option:Int) -> [T] { 
    var result:[T] = [] 

    switch option { 
    case 1: 
     let sampleString:String = "hello" 
     result.append(sampleString) 
    case 2: 
     let sampleInt:Int = 23 
     result.append(sampleInt) 
    default: 
     return result 
    } 

    return result 
} 

이 다음과 같은 오류가 날 수 있습니다 : I는 다음과 같이 시작했다. 함수를 호출 할 때 반환되는 배열에 어떤 유형이 있는지 모르지만 함수는 배열에 항목을 추가하기 전에 형식을 결정하는 방법을 알고 있습니다.

어떻게 스위프트에서이 작업을 수행 할 수 있습니까?

+0

검사기가 switch'es'에 대해 알고하지 않습니다 유형; 'option'의 값에 따라 T_will_이 무엇인지 알 수는 없습니다. 이것을 두 가지 기능으로 나눌 수없는 이유가 있습니까? –

+0

반환 유형이 입력 유형과 관련이없는 경우 Any Swift 3 또는 AnyObject Swift 2의 배열 만 반환합니다. –

답변

5

스위프트는 여러 유형의 변수를 지원하지 않습니다. 제네릭 T를 사용하면 함수가 제네릭이되므로 호출자가 반환 유형을 선택할 수 있습니다. 디자인을 재고해야합니다.

1 : Any를 배열 사용

당신이 정말로 매개 변수에 따라 여러 결과 유형을 반환하려면

는 몇 가지 해결 방법이 있습니다.

var result:[Any] = [] 

2 : 관련 값과 함께 열거를 사용

enum TestFuncResult { 
    case string(String) 
    case int(Int) 
} 

func testFunc(option: Int) -> [TestFuncResult] { 
    var result:[TestFuncResult] = [] 

    switch option { 
    case 1: 
     let sampleString:String = "hello" 
     result.append(.string(sampleString)) 
    case 2: 
     let sampleInt:Int = 23 
     result.append(.int(sampleInt)) 
    default: 
     return result 
    } 

    return result 
} 
관련 문제