Swift에서 사전을 반복


222

Xcode가 Swift Programming Language Guide 의이 실험에 나에게주는 대답에 약간 혼란 스럽습니다.

// Use a for-in to iterate through a dictionary (experiment)

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25]
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

사전이 횡단 될 때 가장 큰 숫자가 변수로 설정되고 있음을 이해합니다 largest. 그러나 Xcode가 largest각 테스트에 따라 5 번 또는 1 번 또는 3 번 설정되고 있다고 말하는 이유가 혼란 스럽 습니다.

코드를 살펴볼 때 "Prime"만으로 6 번 설정해야한다는 것을 알았습니다 (2, 3, 5, 7, 11, 13). 그런 다음 "피보나치"의 숫자는 모두 가장 큰 숫자보다 작으므로 현재 "프라임"에서 13으로 설정되어 있으므로 건너 뛰어야합니다. 그런 다음 "제곱"에서 16으로 설정하고 마지막으로 25를 설정하여 총 8 번을 생성해야합니다.

내가 완전히 명백한 것을 놓치고 있습니까?

답변:


355

Swift (및 기타 언어)의 사전은 주문되지 않습니다. 사전을 반복 할 때 순서가 초기화 순서와 일치한다는 보장은 없습니다. 이 예에서 Swift는 "Square"키를 다른 것보다 먼저 처리합니다. 루프에 print 문을 추가하여이를 확인할 수 있습니다. 25는 Square의 5 번째 요소이므로 Square에서 5 개의 요소에 대해 5 배로 설정된 다음 25에 머무 릅니다.

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25]
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    println("kind: \(kind)")
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

인쇄합니다 :

kind: Square
kind: Prime
kind: Fibonacci

1
정말 고맙습니다! 나는 잠시 동안 우연히 만났다. 해부를 기대하기 위해 각 키의 숫자를 계속 추가하고 제거했지만 아무데도 가지 못했습니다. 귀하의 설명은 대단히 감사합니다!
Nick Kohrn

15
let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"]
dict.forEach { print($0) }

결과는

( "FirstName", "Maninder") ( "LastName", "Singh") ( "주소", "Chandigarh")


이 예제가 1,000 데이터 루프에서 더 효율적인지 말해 주실 수 있습니까? 원인 JSON이 너무 커서 결국 1GB 처리가 필요합니다. 최신 장치는 충돌하지 않지만 내 아이폰 5s에서는 16GB가 절반으로 충돌합니다.
Daniel Arantes Loverde

사전이 순서를 유지하는지 여부에 관한 원래의 질문에 대해 약간 오도 된 것으로 보이며 그렇지 않은 경우 순서를 유지하는 예를 게시합니다.
Declan McKenna

12

이것은 사전을 반복하는 사용자 정의 함수입니다.

func findDic(dict: [String: String]){
    for (key, value) in dict{
    print("\(key) : \(value)")
  }
}

findDic(dict: ["Animal":"Lion", "Bird":"Sparrow"])
//prints Animal : Lion 
         Bird : Sparrow

11

다음은 해당 실험에 대한 대안입니다 (Swift 3.0). 이것은 정확히 어떤 종류의 숫자가 가장 큰지를 알려줍니다.

let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]

var largest = 0
var whichKind: String? = nil

for (kind, numbers) in interestingNumbers {
    for number in numbers {
    if number > largest {
        whichKind = kind
        largest = number
    }
  }
}

print(whichKind)
print(largest)

OUTPUT:
Optional("Square")
25

8

모든 값을 반복하려면 다음을 수행하십시오.

dict.values.forEach { value in
    // print(value)
}

나는 사실이 너무 싫어서 이것이 맞습니다. 멍청한 요다는 신속하게 창조주와 대화해야합니다. 🤮
Sebastian


1

다음 values.makeIterator()과 같이 dict 값을 반복 하는 데 사용할 수도 있습니다 .

for sb in sbItems.values.makeIterator(){
    // do something with your sb item..
    print(sb)
}

더 빠른 스타일로 다음과 같이 반복을 수행 할 수도 있습니다.

sbItems.values.makeIterator().forEach{
    // $0 is your dict value..
    print($0) 
}

* sbItems는 유형의 dict입니다[String : NSManagedObject]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.