2015-09-04 123 views
0

可以说我想拥有一个函数数组(闭包),我稍后想要分派。我希望所有闭包都可以将任何类型的数组作为单个参数。在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中存储将数组中的不同类型作为参数的闭包?

+1

泛型。 (GeneralArray) - > Void是预期的,并且你正在传递(Int) - > Void。试试func intArrayFunc([GeneralArray]) - > Void。检查这个http://stackoverflow.com/questions/29829763/how-to-define-array-of-closures-in-swift – jarryd

回答

0

使用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 }) 
    } 
} 
相关问题