Tehnografi.com - Технологические новости, обзоры и советы

Объяснения словарей в Swift

Следующая статья поможет вам: Объяснения словарей в 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:) может возвращать две вещи:

  1. Он возвращает ноль, если ключ не присутствовал в массиве до его установки.
  2. Он возвращает текущее значение, то есть «старое значение» ключа перед его установкой, если ключ присутствует в массиве.

Благодаря функции 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. У нас есть несколько типов коллекций, например: