Основы Swift / 5.7. Словари 2 - Получение доступа и изменение


Видео


Получение доступа и модификация словаря
Вы можете получить доступ и модифицировать словарь с помощью его методов и свойств или с использованием синтаксиса сабскриптов.

Как и в случае с массивами Вы можете узнать количество элементов в Dictionary с помощью проверки доступного только для чтения свойства count:
@{5.7\1\1}
                    
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
print("Словарь аэропортов содержит следующее количество записей: \(airports.count).")
// Выведет "Словарь аэропортов содержит следующее количество записей: 2."
                    
                
Проверка словаря на пустоту
Используйте Булево свойство isEmpty в качестве короткой формы для проверки того, что свойство count равно 0:
@{5.7\1\2}
                    
if airports.isEmpty {
    print("Словарь аэропортов пуст.")
} else {
    print("Словарь аэропортов не пуст.")
}
// Выведет "Словарь аэропортов не пуст."
                    
                
Добавление нового элемента в словарь
Вы можете добавить новый элемент в словарь с использованием сабскрипт-синтаксиса. Используйте новый ключ подходящего типа в качестве индекса сабскрипта и присвойте новое значение подходящего типа:
@{5.7\1\3}
                    
airports["LHR"] = "London"
// словарь airports теперь содержит 3 элемента
                    
                
Изменение значения элемента в словаре с помощью сабскрипта
Вы также можете использовать синтаксис сабскрипта для изменения значения, связанного с определённым ключом:
@{5.7\1\4}
                    
airports["LHR"] = "London Heathrow"
// значение "LHR" изменилось на "London Heathrow"
                    
                
Изменение значения элемента в словаре с помощью метода
В качестве альтернативы сабскриптингу Вы можете использовать метод словаря updateValue(_:forKey:) для задания и обновления значения для определённого ключа. Как и примеры сабскриптов, рассмотренные ранее, метод updateValue(_:forKey:) устанавливает значение для ключа, если по нему ничего не существует, или обновляет значение, если ключ уже задан. В отличие от сабскрипта метод updateValue(_:forKey:) возвращает старое значение после выполнения обновления. Это позволяет Вам проверить, произошло или нет обновление.

Метод updateValue(_:forKey:) возвращает опциональную величину для типа значения словаря. Для словаря, который хранит значения типа String, например, метод вернёт величину типа String? или "опциональный String". Этот опционал содержит старое значение для этого ключа, если оно существовало до обновления, или nil, если никакого значения не было:
@{5.7\1\5}
                    
if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
    print("Старое значение для ключа DUB было \(oldValue).")
}
// Выведет "Старое значение для ключа DUB было Dublin."
                    
                
Получение значения элемента по ключу
Вы также можете использовать синтаксис сабскриптов для получения значения из словаря для конкретного словаря. Так как возможно, что запрошенный ключ не имеет связанного значения, то сабскрипт словаря вернёт опциональное значение типа значения словаря. Если словарь содержит значение для запрошенного ключа, то сабскрипт вернёт опциональное значение с существующим значением для этого ключа. В противном случае сабскрипт вернёт nil:
@{5.7\1\6}
                    
if let airportName = airports["DUB"] {
    print("Имя аэропорта \(airportName).")
} else {
    print("Такого аэропорта нет в словаре аэропортов.")
}
// Выведет "Имя аэропорта Dublin Airport."
                    
                
Удаление значения из словаря с помощью присвоения nil
Вы можете использовать сабскрипт-синтаксис для удаления пары ключ-значение из словаря, присвоив nil в качестве значения для этого ключа:
@{5.7\1\7}
                    
airports["APL"] = "Apple International"
// "Apple International" - это несуществующий аэропорт для APL, так что удалите его
airports["APL"] = nil
// APL теперь был удалён из словаря
                    
                
Удаление значения из словаря с помощью метода
Иначе, Вы можете удалить пару ключ-значение из словаря с помощью метода removeValue(forKey:). Этот метод удаляет пару ключ-значение, если она существует, и возвращает удалённое значение или значение nil, если значение не существовало:
@{5.7\1\8}
                    
if let removedValue = airports.removeValue(forKey: "DUB") {
    print("Имя удалённого аэропорта: \(removedValue).")
} else {
    print("Словарь аэропортов теперь содержит значение для DUB.")
}
// Выведет "Имя удалённого аэропорта: Dublin Airport."
                    
                
Итерирование по словарю
Вы можете проитерироваться через пары ключ-значение в словаре с помощью цикла for-in. Каждый элемент в словаре будет возвращён в качестве кортежа (key, value), и Вы можете декомпозировать члены кортежа во временные константы или переменные в качестве итерирования:
@{5.7\1\9}
                    
for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}
                    
                
Итерабельные коллекции из словаря
Вы также можете получить итерабельную коллекцию из ключей словаря или значений с помощью получения доступа к свойствам key и values:
@{5.7\1\10}
                    
for airportCode in airports.keys {
    print("Код аэропорта: \(airportCode)")
}
// Код аэропорта: LHR
// Код аэропорта: YYZ

for airportName in airports.values {
    print("Имя аэропорта: \(airportName)")
}
// Имя аэропорта: London Heathrow
// Имя аэропортаe: Toronto Pearson
                    
                
Массивы из словарей
Если Вам нужно использовать ключи или значениями словаря с API, которое принимает объекты типа Array, инициализируйте новый массив со свойствами keys или values:
@{5.7\1\11}
                    
let airportCodes = [String](airports.keys)
// airportCodes теперь ["YYZ", "LHR"]

let airportNames = [String](airports.values)
// airportNames теперь ["Toronto Pearson", "London Heathrow"]
                    
                
Порядок элементов в словаре
Тип Dictionary в Swift не имеет заданного порядка. Для итерирования через ключи или значения словаря в заданном порядке используйте метод sorted() на свойствах keys или values.
Массив и словарь?
Как Вы могли заметить, Вы можете использовать в качестве ключей целочисленные индексы, что даёт Вам возможность использовать словарь в качестве массива за исключением того, что например новые добавленные элементы в словарь не будут автоматически получать следующий индекс, удаляемые элементы не будут сжимать свои пропуски, а кроме того словарь не сохраняет свой порядок.

Однако массив можно считать на концептуальном уровне частным случаем словаря. В некоторых языках словари так и называются: ассоциативные массивы. Обыкновенный массив так же, как и словарь, создаёт ассоциацию между значением типа Int и каким-нибудь другим типом.

Так же ассоциативные массивы или словари иногда называют отображениями. В Swift не существует мультиотображений, позволяющих иметь несколько типов ключей для одного значения. Так же не существует стандартных обратных отображений, в которых значения могут использовать в качестве ключей для своих ключей.

Из всего этого Вы должны сделать единственный вывод - там, где это нужно, используйте обычные массивы, а не словари, так как первые отпимизированы для своей цели - хранить упорядоченный список элементов.