【问题标题】:Casting closures in Swift?在 Swift 中铸造闭包?
【发布时间】:2015-04-08 10:48:54
【问题描述】:

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

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 捕获 self,它可以安全地直接添加到回调数组中,无需保留对包装器的引用:

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 )

它工作得很好,但我当然在市场上寻找一种更简单的解决方案,如果有的话......

【问题讨论】:

    标签: swift casting callback closures


    【解决方案1】:

    你想要做的事情不能在 Swift 中完成(现在)。

    这就像您试图将对象 Dog 转换为对象 Cat,具有以下实现:

    class Cat {
        var value: UIView!
    }
    
    class Dog {
        var value: AnyObject!
    }
    

    我希望这会出现在 Swift 的未来版本中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多