【问题标题】:Swift optional binding and SKNode.nameSwift 可选绑定和 SKNode.name
【发布时间】:2014-11-11 13:52:28
【问题描述】:

有没有更好的方法来编写我得到每个 SKNode 名称的代码,只是看起来有点啰嗦。

// eachChild is an SKNode
for eachChild in children {
    var theActualChildName: String
    if let childName = eachChild.name {
        theActualChildName = childName
    } else {
        theActualChildName = "Undefined"
    }
    println("NODE NAME = \(theActualChildName)")
}

我可以写,(见下文)即使没有名字也能工作,但如果感觉不好,因为它强制解开一个可选的。

// eachChild is an SKNode
for eachChild in children {
    println("NODE NAME = \(eachChild.name!)")
}

我知道 Swift 完全是为了安全,但感觉就像我陷入了代码的困境,想知道我是否遗漏了什么?

编辑: 我注意到即使SKNode.name 是一个字符串?如果你强制打开它并且它没有返回值并且空字符串"",我想它会返回零。

EDIT2: 请注意,Antonio 的答案确实是我所追求的,但在 SKNode.name 的情况下,当节点来自 scene.SKS 文件时,似乎即使没有指定名称,节点仍会获得名称 @ 987654327@(空字符串)。如果你运行代码:

let childName = eachChild.name ?? "Undefined"

您将获得给定的"Name""",您将永远不会获得"Undefined" 如果您设置eachChild.name = nil 并运行上面的代码,您将获得"Undefined" 我假设name 属性正在获取如果没有指定其他值,则在 *.sks 文件中设置为 ""。

【问题讨论】:

    标签: swift sprite-kit optional sknode


    【解决方案1】:

    我认为name 是一个可选字段——你可以使用nil coalescing operator

    let actualChildName = eachChild.name ?? "Undefined"
    

    【讨论】:

    • 是的,似乎是最好的方法。 (例如,您可以将其与更多功能操作结合起来——构建名称数组,您只需要一个单行:let namesArray = children.map { $0.name ?? "Undefined" }
    • 是的,map 的用法很好。只需 3 种方法就可以完成无穷无尽的事情:mapfilterreduce :)
    • 非常感谢安东尼奥,这正是我所追求的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多