2016-08-28 50 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 
}