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