2017-01-15 5 views
0

ロバートC.マーティンの「クリーンコード」という本を読んでいるとき、彼は常に1〜2レベルのインデントを保つようにしなければならないと言いました。最大で3つ1〜2行のインデントを維持する方法。

言って、我々は[Int:[Int:[Int:String]]]の種類(SWIFT)は、辞書(myDict)を持っているし、我々はすべての値をループにしたい場合は、私たちが行くのコードの一部を使用します:

for (key1, value1) in myDict 
{ 
    for (key2, value2) in value1 
    { 
     for (key3, value3) in value2 
     { 
       //Do stuff 
     } 
    } 
} 

ようにあなたは見ることができます、 '/ /物事を行う部分は< = 3の代わりに4回意図されています。

どのように私は最大3レベルのインデント(1または2が望ましい)にとどまっている間にこのコードを作成できますか?

これは可能ですか?私は答えがすべての言語のために好きですか?しかし、もしそれが愚かでないなら、それはスウィフトのためにできるのでしょうか?

+2

最初にネストされた辞書にデータを保存することはありません。 – Sulthan

+0

これを行う最善の方法は何でしょうか?私はその辞典をNSUserDefaultsに保存したい。すべてのデータは互いに関連しています。 – iProgram

+0

あなたのデータを私たちに教えてください。 'String'は3つの整数でインデックスされていますか?私はあなたができるオブジェクトにいくつかのラッピングがあることをかなり確信しています。 3つの整数を1つのインデックスオブジェクトにラップすることができます。あなたがしていることを詳しく説明してください。 – Sulthan

答えて

0

ない非常に優雅な方法は、関数を作成することです一般的なうなずき...

明らかに私たちはあなたのデータは私が追加することは不可能だが何であるかを見ることができないので、あなたがより記述されているが、関数名を使用することになり
func iterateFirstDict(dictionary: [Int: [Int: [Int: String]]]) { 
    for (key, value) in dictionary { 
     iterateSecondDictionary(value) 
    } 
} 

func iterateSecondDictionary(dictionary: [Int: [Int: String]]) { 
    for (key, value) in dictionary { 
     iterateThirdDictionary(value) 
    } 
} 

func iterateThirdDictionary(dictionary: [Int: String]) { 
    for (key, value) in dictionary { 
     // do stuff 
    } 
} 

それらはここにある。

これに近づく方がはるかに良い方法は、データオブジェクトとその中に埋め込まれた関数を使って作業することです。

+0

私はaccsedentlyそれをクリックした。私はモバイルアプリを使っています。 – iProgram

+0

@iプログラムああ、心配しない:-) – Fogmeister

0

すべてのデータが最も深い辞書の内部にある場合のみ、ネストされた辞書はフラット辞書より利点がないことに気付きます。それでは、ただ1つのオブジェクトに私たちのインデックスをマージしてみましょう:

struct MyIndex : Hashable { 
    let indices: (Int, Int, Int) 

    init(_ index1: Int, _ index2: Int, _ index3: Int) { 
     self.indices = (index1, index2, index3) 
    } 

    var hashValue: Int { 
     return indices.2 // this should ideally use all the 3 indices 
    } 

    public static func ==(lhs: MyIndex, rhs: MyIndex) -> Bool { 
     return lhs.indices == rhs.indices 
    } 
} 

(ちなみに、これはやっているのUIKitでまさにIndexPathです)。

その後、我々は、だけではなく、Googleのインデックスを使用することができます。

var dictionary: [MyIndex: String] = [:] 

dictionary[MyIndex(0, 0, 0)] = "test" 
dictionary[MyIndex(0, 1, 2)] = "test2" 

for (index, value) in dictionary { 
    print(index.indices, value) 
} 

の代わりに3サイクルのためにネストを、私は一度にすべての値を反復処理しています。

関連する問題