Словарь еще один тип коллекций в программировании на Swift. С помощью словаря вы можете хранить данные в формате ключ-значение.
В этой статье вы узнаете, как создать словарь, а также как изменить словарь, добавляя, удаляя или изменяя его элементы. Также мы рассмотрим, как можно использовать словари в практической разработке на iOS.
Что из себя представляет словарь?
Вы можете использовать словарь для хранения коллекции элементов в формате ключ-значение. Словарь похож на массив в том смысле, что оба они содержат элементы только одного типа.
let scores = ["Bob": 42, "Alice": 10, "Daisy": 33] print(scores) // ["Alice": 10, "Bob": 42, "Daisy": 33]
Тип словаря scores [String: Int]. Это означает , что тип ключей в словаре и тип его значений являются String и Int соответственно. В приведенном выше примере мы явно не указали тип словаря, потому что Swift может вывести его из контекста. Вы не можете изменить тип словаря, как только он был объявлен.
Между скобками […] мы помещаем пары ключ-значение, разделенные запятыми. Ключ и значение разделяются между собой двоеточием. Каждый ключ в словаре уникален.
Вот как можно создать пустой словарь:
let scores = [String: Int]() print(scores)
В приведенном коде мы инициализируем пустой словарь типа [String: Int].
Когда коллекция, такая как словарь, инициализируется с использованием константы let, эта коллекция является неизмяемой. Вы не можете изменить элементы в коллекции. Когда коллекция, такая как словарь, инициализируется с помощью переменной var, эта коллекция является изменяемой.
Добавление и удаление элементов словаря
Расположение элементов в словаре неупорядочено. То есть пары ключ-значение в словаре не имеют порядка по умолчанию или какой-либо сортировки.
Вернемся к предыдущему примеру со словарем scores:
var scores = ["Bob": 42, "Alice": 10, "Daisy": 33]
Для добавления новой пары ключ-значение в словарь мы используем:
scores["Finn"] = 99
Приведенный выше код добавляет новый ключ “Finn” в словарь scores со значением 99. Обратите внимание, что его тип такой же, как и типы других элементов в словаре scores, то есть String для ключей и Int для значений.
Удаление элемента из словаря выполняется путем присвоения его значению nil:
scores["Alice"] = nil
Получение и изменение элементов словаря
Начнем с получения значений из словаря:
let score = scores["Bob"]
При этом тип полученного значения score будет Int?. Это означает, что возвращаемое значение словаря является опциональным.
Почему это происходит? Потому что нельзя быть уверенным, что данный ключ существует в словаре. Когда вы используете ключ, которого нет в словаре, возвращается значение nil.
var scores = [ "Bob": 42, "Alice": 10, "Daisy": 33 ] let score_bob = scores["Bob"] print(score_bob) // Optional(42) let score_unknown = scores["Arthur"] print(score_unknown) // nil
Значение score_bob имеет тип Optional(42) или Int? Значение score_unknown nil.
Мы можем использовать опциональное связывание при получении значений из словаря:
if let score = scores["Bob"] { print(score) }
Также мы можем изменить словарь с помощью похожего синтаксиса:
var scores = ["Bob": 42, "Alice": 10, "Daisy": 33] scores["Alice"] = 101 print(scores) // ["Alice": 101, "Bob": 42, "Daisy": 33]
Значение для ключа “Alice” теперь изменено на 101. Синтаксис для добавления, удаления, изменения и получения элементов из словаря по сути одинаков.
Но что, если вы хотите знать, была ли пара ключ-значение добавлена в словарь или изменена по сравнению с существующей парой ключ-значение? Здесь нам поможет функция updateValue(_:forKey:):
if let oldScore = scores.updateValue(99, forKey: "Daisy") { print("Счет Daisy был: \(oldScore)") } else { print("Нет игрока с данным именем...") }
Дананя функция возвращает одно из двух значений:
- Возвращает nil, когда ключ не присутствовал в словаре до его установки.
- Возвращает текущее значение, то есть «старое значение» ключа перед его установкой, если ключ присутствует в словаре.
Словари в разработке под iOS
Словари используются во время разработки iOS во многих формах. Рассмотрим структуру данных формата JSON, который широко используется различными API и веб-сервисами.
[ { "username": "@reinder42", "profile_url": "https://twitter.com/profiles/reinder42.jpg" "tweets": [...] }, { "username": "@arthurdent", "profile_url": "https://twitter.com/profiles/arthur_dent.jpg" "tweets": [...] }, { "username": "@xxx_darthvader1999", "profile_url": "https://twitter.com/profiles/darthvader.jpg" "tweets": [...] } ]
Если вы посмотрите внимательно, то увидите, что элемент верхнего уровня – это массив, обозначенный как [ ]. И элементы в массиве являются словарями, обозначенными { }. Они связывают ключи со значениями, такими как “username “и “@reinder42”.
Вы можете преобразовать JSON в массив словарей Swift:
let twitter = [ [ "username": "@reinder42", "profile_url": "https://twitter.com/profiles/reinder42.jpg" "tweets": [···] ], ··· ]
При переборе массива twitter с помощью цикла for вы можете получить имя пользователя Twitter с помощью:
for item in twitter { let username = item["username"] // Выполнить код. }
Также словари в Swift используются:
- При сохранении пользовательских настройек по умолчанию в UserDefaults.
- При сохранение значений ключей в iCloud.
- Объекты Firebase Firestore являются словарями.
- Основой файлов в формате Plist является словарь, закодированный как XML.