2015-04-08 59 views
3

似乎兼容參數和返回類型的閉包不能被轉換(向上或向下)。我想在Dictionary中存儲回調數組,其中的鍵可以用來確定回調參數的類型。只是投放不會做:斯威夫特鑄造關閉?

typealias AnyCallback = (value: AnyObject)-> Void 
typealias SpecializedCallback = (value: UIView) -> Void 

let callback : SpecializedCallback = 
{ 
    (value: UIView) in 
    println(value) 
} 

if let castCallback : AnyCallback = callback as? AnyCallback 
{ 
    // block never executed 
    println("did cast callback") 
    castCallback(value: self.view) 
} 

作爲一種變通方法,可以包裹回調泛型類,它將處理參數的類型轉換:

final class GenericCallback<T> 
{ 
    func executeCallback(value: Any?) -> Void 
    { 
     if let specificValue = value as? T 
     { 
      specificCallback(value: specificValue) 
     } 
    } 

    init(callback: (value: T?)->Void) 
    { 
     self.specificCallback = callback 
    } 

    private let specificCallback : (value: T?)->Void 
} 

由於executeCallback捕捉自我,它可以直接安全地加入到回調的陣列,無需將保持到包裝材料的引用:

typealias GenericCallbackType = (value: Any?) -> Void 

var callbackArray : [ GenericCallbackType ] = [] 

let specializedCallback = 
{ 
    (value: UIView?) -> Void in 
    println(value) 
} 

let wrappedCallback = GenericCallback(callback: specializedCallback) 

callbackArray.append(wrappedCallback.executeCallback) 

它工作正常,但當然我在市場上是一個簡單的解決方案應該有一個...

回答

5

你想做的事情不能在Swift(現在)完成。

這就像你想投的對象狗爲對象貓,有下面的實現:

class Cat { 
    var value: UIView! 
} 

class Dog { 
    var value: AnyObject! 
} 

我希望這來自於雨燕的未來版本。

+0

感謝您的意見。現在我會堅持使用我的包裝解決方案... – Gregzo