Swift 在斯威夫特铸造封口?

Swift 在斯威夫特铸造封口?,swift,casting,callback,closures,Swift,Casting,Callback,Closures,似乎兼容参数和返回类型的闭包不能强制转换(向上或向下)。我想将回调数组存储在字典中,在字典中可以使用键来确定回调参数的类型。仅仅铸造是不行的: typealias AnyCallback = ( value: AnyObject )-> Void typealias SpecializedCallback = ( value: UIView ) -> Void let callback : SpecializedCallback = { ( value: UIView )

似乎兼容参数和返回类型的闭包不能强制转换(向上或向下)。我想将回调数组存储在字典中,在字典中可以使用键来确定回调参数的类型。仅仅铸造是不行的:

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
}

它工作得很好,但我当然希望有一个更简单的解决方案,如果有…

您试图做的事情不能在Swift中完成(现在)

这就像您试图将对象狗强制转换为对象猫,该对象猫具有以下实现:

class Cat {
    var value: UIView!
}

class Dog {
    var value: AnyObject!
}
我希望这是Swift的未来版本

class Cat {
    var value: UIView!
}

class Dog {
    var value: AnyObject!
}