【问题标题】:Cast Callback Parameter in Swift在 Swift 中强制转换回调参数
【发布时间】:2014-06-17 20:21:22
【问题描述】:

我正在尝试将 SKNode 转换为我自己的 SKNode 子类(标志)。

scene.enumerateChildNodesWithName("flag") {
    node as Flag, stop in
        node.methodAvailableToFlagObject()
}

上面的代码抛出一个错误。有解决办法吗?

我试图避免这样做:

scene.enumerateChildNodesWithName("flag") {
    node, stop in 
        let realNode = node as Flag
        realNode.methodAvailableToFlagObject()
}

非常感谢您的帮助!

【问题讨论】:

  • 因为看起来你并不真的需要 stop 参数,你可以省略整个 in 行。在第一个喜欢你可以使用这个代替:let node = $0 as Flag
  • 好点。为了清楚起见,我通常不会这样做,但你说得对,它确实简化了代码。

标签: swift


【解决方案1】:

您只能向上转换为父类型:

var closure : (Subclass) -> () = {
    (first : Superclass) in
}

你不能向下转换为子类

【讨论】:

  • 那么在这种情况下没有解决方案,因为我无法控制函数定义?
  • 正确。我认为您唯一更好的解决方案是@ackStOverflow 建议的内联转换
  • 嗯...也许我在这里遗漏了什么?我知道这不是“你不能向下转换为子类”的情况,Swift Programming Language 书中类型转换部分的一半致力于安全向下转换。 :) 有人能解释一下这个案例的不同之处吗?
  • @ackStOverflow 我的意思是你不能通过将参数声明为子类来降低情绪。您当然可以在实现中手动向下转换(他的示例已经在做)
【解决方案2】:

怎么样

scene.enumerateChildNodesWithName("flag") {
    node,  stop in
    if let flag = node as? Flag {
        flag.methodAvailableToFlagObject()
    }
}

【讨论】:

    【解决方案3】:

    您可以使用括号强制转换方法链,例如

    (node as Flag).methodAvailabletoFlagObject()
    

    ...如果可能会失败,您甚至可以使用可选的强制转换形式,然后将其与可选链接结合起来:

    (node as? Flag)?.methodAvailableToFlagObject()
    

    【讨论】:

    • 不错的提示。仍然对我没有太大帮助,因为这可能会导致冗余代码。去接受@drewag 的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多