2016-08-28 10 views
0

私はアイテムの配列を返す必要がある関数を書いています。関数では、関数から返りたいアイテムのタイプを決定するロジックがあります。私はこのような何かを開始しました:特定のタイプへのSwiftジェネリックアレイ

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 
} 

これは私に次のエラーを与える:

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

それは私が私の問題を解決する方法を把握しようとしています、理にかなっていますが、。関数を呼び出すと、返される配列の型はわかりませんが、配列に項目を追加する前に型を判別する方法は関数が知っています。

私はこれをSwiftでどのように達成できますか?

+0

チェッカーがswitch'es '知らないタイプ。 'option'の値に基づいてT_will_が何であるかを知ることはできません。これを2つの機能に分解できない理由はありますか? –

+0

戻り値の型が入力型に関係していない場合は、Any Swift 3またはAnyObject Swift 2の配列を返します –

答えて

5

スウィフトは複数のタイプの変数をサポートしていません。ジェネリックTを使用すると汎用関数が生成され、呼び出し元が戻り値の型を選択できるようになります。 デザインを再考する必要があります。

あなたが本当にパラメータに基づいて複数の結果の型を返すようにしたい場合は、いくつかの回避策があります。

1:任意の配列を使用してください。

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 
} 
関連する問題