2015-09-04 122 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 }) 
    } 
} 
相關問題