首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在斯威夫特铸造闭锁?

在斯威夫特铸造闭锁?
EN

Stack Overflow用户
提问于 2015-04-08 10:48:54
回答 1查看 1.3K关注 0票数 4

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

代码语言:javascript
复制
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 )
}

作为一种解决方法,可以将回调包装在泛型类中,该类将处理参数类型转换:

代码语言:javascript
复制
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时,它可以安全地直接添加到回调数组中,从而消除了保留对包装器的引用的需要:

代码语言:javascript
复制
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 )

很好,但我当然想要一个更简单的解决方案.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-08 17:43:52

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

就像尝试将对象狗转换为对象猫一样,对象猫具有以下实现:

代码语言:javascript
复制
class Cat {
    var value: UIView!
}

class Dog {
    var value: AnyObject!
}

我希望这会出现在斯威夫特的未来版本中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29512583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档