swift:安全访问 SCNNode 数组的字典

Posted

技术标签:

【中文标题】swift:安全访问 SCNNode 数组的字典【英文标题】:swift: safely access dictionary of SCNNode arrays 【发布时间】:2016-02-26 17:18:25 【问题描述】:

我对 Swift 比较陌生,还没有掌握可选的安全方面。

我有一本[String: [SCNNode]] 类型的字典。给定的分子将具有多个组件作为[SCNNode] 中的元素。对于那个分子,我检索这个组件数组并将每个元素分配给本地 SCNNode 以进行显示、操作和动画处理。

    let components = moleculeDictionary["aceticAcid"]     // the array of components
        // [baseMolecule, hydrogenCharge, oxygenCharge, ionizingH, ionizedBond, bonds]

    atomsNode_1 = components![0]            // baseMolecule
    baseNode.addChildNode(atomsNode_1)

    atomsNode_5 = components![3]            // ionizingH
    atomsNode_1.addChildNode(atomsNode_5)

   // etc.

在尝试选择性地绑定 this 时,编译器似乎对此很满意。

    if let node = components?[0]            // baseMolecule
        baseNode.addChildNode(node)
    

我不清楚?我对此的阅读表明我们正在以一种我们不在乎是否有零的方式展开包装。但这是否使这个可选绑定比上面的强制展开更好?或者这是“可选链接”?我是否应该在分配components 时只进行检查?我应该担心这里的安全吗?我所做的唯一“升级”测试是在将字典存档分配给moleculeDictionary 之前是否存在。

我将有数百个这样的任务,所以我想把它做好。欢迎就处理此问题的最佳方法提出建议!

谢谢,伯恩

【问题讨论】:

强制展开会使您的应用程序崩溃。可选地展开只是意味着代码不会运行。 意思是 ?是这里使用的“可选解包”吗? 是的。基本上,如果值可以解包,则将其绑定到变量并执行大括号中的代码。 变量而不是常量?所以你认为我上一个代码 sn-p 的方法是合理的吗?谢谢!编辑:糟糕,错过了您在下面的回复... 【参考方案1】:

在我看来,您应该担心 Swift 的安全性。鉴于您上面的代码,我将在第一遍将其重写为:

guard let components = moleculeDictionary["aceticAcid"] where components.count > 3 else  // handle the case where there is no value for this key, or not enough nodes 

// Now I know that I have the correct number of components I don't need to  force unwrap:

atomsNode_1 = components[0]            // baseMolecule
baseNode.addChildNode(atomsNode_1)

atomsNode_5 = components[3]            // ionizingH
atomsNode_1.addChildNode(atomsNode_5)

这是第一关。第二遍是确保我有所有组件的值将是编写一个包含 SCNNode 值的结构,以便我为每个节点都有一个值或一个 nil,然后你可以建立你的节点相应的结构。

编辑添加

这是第二遍的指示 - 这确实需要比我拥有更多的领域知识,但这是一个开始。

看来你是从[[SCNNode]] 构建分子(SCNNodes 的数组数组,其中每个子数组的位置很重要。值得将它放入它自己的结构中,这样:

struct Molecule 
    let baseMolecule: [SCNNode]?
    let hydrogenCharge: [SCNNode]?
    let oxygenCharge: [SCNNode]?
    let ionizingH: [SCNNode]?
    let ionizedBond: [SCNNode]?
    let bonds: [SCNNode]?

    // Other methods can be written to build up atom nodes from within the struct which handle the cases where the component array is nil

【讨论】:

非常感谢!我了解第一遍并将使用它。我喜欢确认计数的附加方面。我在实施“第二次通过”时迷失了方向。 (我从来没有使用过结构体。) “第一次通过”建议效果很好。我怀疑这会让我达到 90% 的安全水平,直到我可以解析“第二次通过”细节。我现在知道已加载字典成员并且它具有正确数量的组件。再次感谢。 感谢您的编辑。我的字典值都是一个数组,我已经更正了我的帖子。我想这意味着在结构中省略括号但保持节点树成员的顺序。

以上是关于swift:安全访问 SCNNode 数组的字典的主要内容,如果未能解决你的问题,请参考以下文章

Swift 字典内的值访问和更改(涉及数组的字典)

窥探Swift之数组安全索引与数组切片

从 SCNNode 对象转场(Swift)

Swift 如何访问 Struct 对象字典中的特定变量

Swift 中的字典访问

Swift 3:数组到字典?