swift - 传递带有子参数类型的闭包

标签 swift

是否可以将带有子类型参数的闭包传递给接受带有父类型参数的闭包的函数?这就是我想结束的内容。 MoveEvent 继承自 Event

func on(name:String,callback:(Event) -> ()){ ... }

这是我对此函数的调用:

symbol.on("move",{ (event:MoveEvent) ->() in
    ...
});

当我尝试这个时,xcode 说我无法使用这些参数调用它

最佳答案

你可以用泛型来做到这一点:

class Event {}

class MoveEvent: Event {}

func on<T: Event>(name:String, callback:(T) -> ()) {}

on( "move", callback: { (event: MoveEvent) -> () in
    ...
});

on( "other", callback: { (event: Event) -> () in
    ...
});

但是,否则,当您调用 on(_:callback:) 函数时定义的闭包签名必须与用作参数类型的闭包签名相匹配,即也就是说,您必须使用 Event 而不是 MoveEvent 作为 event 参数的类型。如果您希望传入 MoveEvent,则必须将其从 Event 转换为该类型。

symbol.on("move",{ (event:Event) ->() in
    if let moveEvent = event as? MoveEvent {
        ...
    }
});

关于swift - 传递带有子参数类型的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31504000/

相关文章:

ios - UISearchController:searchResultsController 不显示

ios - Swift/iOS 布局屏幕元素的最佳实践

Xcode 7 内存泄漏

swift - 在 SKLabelNode 中显示多行

ios - 防止出现警报时显示 View Controller

ios - 在 xcode 中使用 swift 设置文本字段的填充

swift - 如何获取月份的最后一天

arrays - Swift:使用备用键的合并排序算法

ios - Swift:如何解决 'protocol' 类型的弱变量非法的问题

ios - Swift dismiss modal view on tableView select(控制流的最佳实践)