2015-04-08 56 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