2017-01-15 8 views
0

로버트 C. 마틴 (Robert C. Martin)의 책 'Clean Code'를 읽으면서 그는 항상 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 번 intention 있습니다.

최대 3 단계의 들여 쓰기 (선호하는 1 또는 2)에서이 코드를 만들 수 있습니까?

이것은 가능합니까? 나는 모든 언어에 대한 답변을 원합니다. 그러나 그것이 소극적이지 않다면, 스위프트를위한 ​​것일 수 있습니까?

+2

처음에는 데이터를 중첩 된 사전에 보관하지 않을 것입니다! – Sulthan

+0

그러면 그 일을하는 가장 좋은 방법은 무엇입니까? 그 딕타를 NSUserDefaults에 저장하고 싶습니다. 모든 데이터는 서로 관련이 있습니다. – iProgram

+0

귀하의 데이터를 보여주십시오. 당신은'String'을 3 개의 정수로 인덱싱합니까? 나는 당신이 할 수있는 물건들로 감싸는 것이 확실하다. 3 개의 정수를 하나의 인덱스 객체로 래핑 할 수 있습니다. 당신이 무엇을하고 있는지 자세히 설명하십시오. – 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 프로그램 ah, 걱정할 필요가 없습니다 :-) – Fogmeister

0

중첩 된 사전은 모든 데이터가 가장 깊은 사전 내부에만있는 경우 플랫 사전에 비해 이점이 없다는 것을 알게됩니다. 그래서 그냥 하나의 객체로 우리의 인덱스를 병합하자

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 일을 정확히이다).

그리고 우리는 단지 대신 색인을 사용할 수 있습니다

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, 나는 한 번에 값을 반복하고있다.