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)
    }

? については不明です。これについての私の読書は、nil があっても気にしないような方法でアンラップしていることを示唆しています。しかし、このオプションのバインディングは、上記の強制的なアンラップよりも優れていますか? それとも、これは「オプションの連鎖」ですか?代わりに、割り当て時にチェックを行う必要があり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)

それが最初の最初のパスです。2 番目のパスは、すべてのコンポーネントに値があることを確認することです。値を含む構造体を記述して、SCNNode各ノードに値または nil を設定し、それに応じてノード構造を構築できるようにします。

編集して追加

これは 2 番目のパスの表示です。実際には、私が持っているよりも多くのドメイン知識が必要ですが、これは始まりです。

[[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 に答える