Итерация через словарь в 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
Массивы представляют собой упорядоченные коллекции, но словари и наборы представляют собой неупорядоченные коллекции.
Таким образом, вы не можете предсказать порядок итераций в словаре или наборе.
Прочитайте эту статью, чтобы узнать больше о
Типы коллекций: Быстрый язык программирования