我有一个通用的Swift函数,如下所示:
func toNSArray<T>() -> [T] {
...
}
编译器没有报错,但我不知道如何调用这个函数。我尝试了:
jList.toNSArray<String>()
jList.<String>toNSArray()
但是它没有起作用。
如何在Swift中调用一个没有输入参数的泛型函数?
你需要通过一些调用上下文告诉 Swift 返回类型应该是什么:
// either
let a: [Int] = jList.toNSArray()
// or, if you aren’t assigning to a variable
someCall( jList.toNSArray() as [Int] )
someCall
接受一个模糊类型,比如Any
作为其参数时才需要这样做。如果相反,someCall
被指定为接受[Int]
作为参数,则函数本身提供了上下文,您可以直接编写someCall(jList.toNSArray())
。extension Array {
func asT<T>() -> [T] {
var results: [T] = []
for x in self {
if let y = x as? T {
results.append(y)
}
}
return results
}
}
let a: [Any] = [1,2,3, "heffalump"]
// here, it’s the 0, defaulting to Int, that tells asT what T is...
a.asT().reduce(0, combine: +)
reduce
吗? reduce
是一种将数组归约为单个值的函数。 在这里,它将一个整数数组和一个起始值为零,然后使用提供的函数(在本例中为 +
)将它们逐个组合起来,得出数字 6。 由于 +
和 0 必须表示数字是整数,因此可以推断出 asT
返回的类型是整数。 - Airspeed Velocity
toNSArray
,但它返回的是一个 Swift 数组而不是NSArray
。另一个原因是,如果包含的类型不都是T
,它看起来可能会失败,但返回类型是非可选的(尽管它可能只用可以强制转换为T
的值填充数组)。 - Airspeed Velocity