2016-08-28 112 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;它無法弄清楚什麼T _將基於'option'的值。是否有一個原因,你不能把它分成兩個功能? –

+0

如果返回類型與輸入類型無關,則返回任意Swift 3或AnyObject Swift 2數組 –

回答

5

Swift不支持多種類型的變量。使用泛型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 
}