在Swift中存储数组中不同类型的闭包
问题描述:
可以说我想拥有一个函数数组(闭包),我稍后想要分派。我希望所有闭包都可以将任何类型的数组作为单个参数。在Swift中存储数组中不同类型的闭包
我想:
var closureList: [(Array) -> Void]
这给出了一个编译器错误:引用泛型类型“数组”要求论点< ...>
我不想贮存一定的封闭阵列,但任何类型的数组的类型,所以我尝试这样做:
protocol GeneralArray {
}
extension Array: GeneralArray {
}
var closureList: [(GeneralArray) -> Void]
这将编译,但是当我尝试添加一个闭合:
func intArrayFunc([Int]) -> Void {
}
closureList.append(intArrayFunc)
我得到一个编译器错误:无法用类型为'(([Int]) - > Void)'的参数列表调用'append'。
是否有一种方法在swift中存储将数组中的不同类型作为参数的闭包?
答
使用GeneralArray
在这种情况下几乎与使用[Any]
相同。因此[Int] -> Void
类型的函数不能转换为这种类型。
但为了有能力处理任何阵列的通用方式GeneralArray
将可能有[Any]
类型的属性:
protocol GeneralArray {
var anyArray: [Any] { get }
}
extension Array: GeneralArray {
var anyArray: [Any] {
return self.map{ $0 as Any }
}
}
var closureList: [(GeneralArray) -> Void] = []
func intArrayFunc([Int]) -> Void {
}
所以,你必须换行功能的关闭是(GeneralArray) -> Void
类型:
// wrapping the function in an appropriate closure
closureList.append({ array in intArrayFunc(array.anyArray.map{ $0 as! Int }) })
// with a helper function
closureList.append(functionConverter(intArrayFunc))
有两种可能的辅助功能,可以 “转换” 功能:
func functionConverter<T>(f: [T] -> Void) -> GeneralArray -> Void {
return { array in
// "safe" conversion to an array of type [T]
let arr: [T] = array.anyArray.flatMap{
if let value = $0 as? T {
return [value]
}
return []
}
f(arr)
}
}
func unsafeFunctionConverter<T>(f: [T] -> Void) -> GeneralArray -> Void {
return { array in
f(array.anyArray.map{ $0 as! T })
}
}
泛型。 (GeneralArray) - > Void是预期的,并且你正在传递(Int) - > Void。试试func intArrayFunc([GeneralArray]) - > Void。检查这个http://stackoverflow.com/questions/29829763/how-to-define-array-of-closures-in-swift – jarryd