Итерация через словарь в Swift

Я немного запутался в ответе, что Xcode дает мне этот эксперимент в Руководстве по языку Swift Programming Language:

// 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 раза, в зависимости от каждого теста.

При просмотре кода я вижу, что его нужно установить 6 раз в "Prime" (2, 3, 5, 7, 11, 13). Затем он должен пропустить любые числа в "Фибоначчи", так как все они меньше самого большого, который в настоящее время установлен на 13 из "Прайм". Затем он должен быть установлен в 16 и, наконец, 25 в "Квадрате", что дает в общей сложности 8 раз.

Я пропустил что-то совершенно очевидное?

Ответ 1

Словари в Swift (и другие языки) не упорядочены. Когда вы итерации через словарь, нет никакой гарантии, что заказ будет соответствовать порядку инициализации. В этом примере Swift обрабатывает ключ "Квадрат" перед другими. Вы можете увидеть это, добавив в цикл инструкцию печати. 25 - 5-й элемент квадрата, наибольший из которых будет установлен 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

Ответ 2

Вот альтернатива для этого эксперимента (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

Ответ 3

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

Результат будет

( "FirstName", "Maninder" ) ( "LastName", "Singh" ) ( "Адрес", "Чандигарх" )

Ответ 4

Массивы представляют собой упорядоченные коллекции, но словари и наборы представляют собой неупорядоченные коллекции. Таким образом, вы не можете предсказать порядок итераций в словаре или наборе.

Прочитайте эту статью, чтобы узнать больше о Типы коллекций: Быстрый язык программирования