在Swift中存储数组中不同类型的闭包

时间:2015-09-04 11:00:46

标签: swift generics

让我们说我想要一个函数(闭包)数组,我稍后会想要发送。我希望所有的闭包都将任何类型的数组作为单个参数。

我试过了:

var closureList: [(Array) -> Void] 

这给出了编译器错误:对泛型类型'Array'的引用需要< ...>

中的参数

我不想存储某种类型数组的闭包但是任何类型的数组,所以我试过这个:

protocol GeneralArray {

}

extension Array: GeneralArray {

}

var closureList: [(GeneralArray) -> Void]

这会编译,但是当我尝试追加一个闭包时:

func intArrayFunc([Int]) -> Void {

}

closureList.append(intArrayFunc)

我收到编译错误:无法使用类型'(([Int]) - > Void)'的参数列表调用'append'。

swift中有没有办法存储在数组中使用不同类型作为参数的闭包?

1 个答案:

答案 0 :(得分:0)

在这种情况下,使用mouseup几乎与使用var downTimer; $("#btn").mousedown(function(e) { $("#inp").val("4"); clearTimeout(downTimer); downTimer = setTimeout(function(){ $("#inp").val("4.5"); }, 1000); }).mouseup(function(e) { clearTimeout(downTimer); }); 相同。因此,类型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