0

我对 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.

为了有选择地绑定它,编译器似乎对此很满意。

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

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

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

谢谢,伯恩

4

1 回答 1

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]]似乎你从(s 的数组数组中构建分子,SCNNode其中每个子数组的位置很重要。值得将它放入它自己的结构中,这样:

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
}
于 2016-02-26T18:03:22.837 回答