Словари в Swift: как их использовать? Разбираемся с Dictionary

Словарь еще один тип коллекций в программировании на 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.
Читайте также:
Добавить комментарий

Ваш адрес email не будет опубликован.