Учебники

Swift — Словари

Словари Swift 4 используются для хранения неупорядоченных списков значений одного типа. Swift 4 устанавливает строгую проверку, которая не позволяет вводить неверный тип в словарь даже по ошибке.

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

Ключ словаря может быть целым числом или строкой без ограничения, но он должен быть уникальным в словаре.

Если вы назначаете созданный словарь переменной, то он всегда изменчив, что означает, что вы можете изменить его, добавив, удалив или изменив его элементы. Но если вы назначаете словарь постоянной, то этот словарь является неизменным, и его размер и содержание не могут быть изменены.

Создание словаря

Вы можете создать пустой словарь определенного типа, используя следующий синтаксис инициализатора —

var someDict = [KeyType: ValueType]()

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

var someDict = [Int: String]()

Вот пример для создания словаря из набора заданных значений —

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]

Инициализация на основе последовательности

Swift 4 позволяет вам создавать словарь из массивов (Key-Value Pairs.)

var cities = [“Delhi”,”Bangalore”,”Hyderabad”]

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

var Distance = [2000,10, 620]

Вот пример для создания словаря из набора заданных значений —

let cityDistanceDict = Dictionary(uniqueKeysWithValues: zip(cities, Distance))

Приведенные выше строки кода создадут словарь с городами в качестве ключа и расстоянием в качестве значения —

фильтрация

Swift 4 позволяет фильтровать значения из словаря.

var closeCities = cityDistanceDict.filter { $0.value < 1000 }

Если мы запустим приведенный выше код, наш словарь closeCities будет.

["Bangalore" : 10 , "Hyderabad" : 620]

Группировка словаря

Swift 4 позволяет создавать группы значений словаря.

var cities = ["Delhi","Bangalore","Hyderabad","Dehradun","Bihar"]

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

var GroupedCities = Dictionary(grouping: cities ) { $0.first! }

Результат приведенного выше кода будет

["D" :["Delhi","Dehradun"], "B" : ["Bengaluru","Bihar"], "H" : ["Hyderabad"]]

Доступ к словарям

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

var someVar = someDict[key]

Давайте проверим следующий пример для создания, инициализации и доступа к значениям из словаря —

Live Demo

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var someVar = someDict[1]

print( "Value of key = 1 is \(someVar)" )
print( "Value of key = 2 is \(someDict[2])" )
print( "Value of key = 3 is \(someDict[3])" )

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Value of key = 1 is Optional("One")
Value of key = 2 is Optional("Two")
Value of key = 3 is Optional("Three")

Модифицирующие словари

Вы можете использовать метод updateValue (forKey :), чтобы добавить существующее значение к заданному ключу словаря. Этот метод возвращает необязательное значение типа значения словаря. Вот простой пример —

Live Demo

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var oldVal = someDict.updateValue("New value of one", forKey: 1)
var someVar = someDict[1]

print( "Old value of key = 1 is \(oldVal)" )
print( "Value of key = 1 is \(someVar)" )
print( "Value of key = 2 is \(someDict[2])" )
print( "Value of key = 3 is \(someDict[3])" )

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Old value of key = 1 is Optional("One")
Value of key = 1 is Optional("New value of one")
Value of key = 2 is Optional("Two")
Value of key = 3 is Optional("Three")

Вы можете изменить существующий элемент словаря, назначив новое значение для данного ключа, как показано в следующем примере —

Live Demo

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var oldVal = someDict[1]
someDict[1] = "New value of one"
var someVar = someDict[1]

print( "Old value of key = 1 is \(oldVal)" )
print( "Value of key = 1 is \(someVar)" )
print( "Value of key = 2 is \(someDict[2])" )
print( "Value of key = 3 is \(someDict[3])" )

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Old value of key = 1 is Optional("One")
Value of key = 1 is Optional("New value of one")
Value of key = 2 is Optional("Two")
Value of key = 3 is Optional("Three")

Удалить пары ключ-значение

Вы можете использовать метод removeValueForKey () для удаления пары ключ-значение из словаря. Этот метод удаляет пару ключ-значение, если она существует, и возвращает удаленное значение или возвращает nil, если значение не существовало. Вот простой пример —

Live Demo

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var removedValue = someDict.removeValue(forKey: 2)

print( "Value of key = 1 is \(someDict[1])" )
print( "Value of key = 2 is \(someDict[2])" )
print( "Value of key = 3 is \(someDict[3])" )

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Value of key = 1 is Optional("One")
Value of key = 2 is nil
Value of key = 3 is Optional("Three")

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

Live Demo

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]

someDict[2] = nil

print( "Value of key = 1 is \(someDict[1])" )
print( "Value of key = 2 is \(someDict[2])" )
print( "Value of key = 3 is \(someDict[3])" )

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Value of key = 1 is Optional("One")
Value of key = 2 is nil
Value of key = 3 is Optional("Three")

Перебор словаря

Вы можете использовать цикл for-in для итерации по всему набору пар ключ-значение в Словаре, как показано в следующем примере:

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]

for (index, keyValue) in someDict.enumerated() {
   print("Dictionary key \(index) - Dictionary value \(keyValue)")
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Dictionary key 2 - Dictionary value Two
Dictionary key 3 - Dictionary value Three
Dictionary key 1 - Dictionary value One

Вы можете использовать функцию enumerate (), которая возвращает индекс элемента вместе с его парой (ключ, значение), как показано ниже в примере —

Live Demo

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
for (key, value) in someDict.enumerated() {
   print("Dictionary key \(key) - Dictionary value \(value)")
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Dictionary key 0 - Dictionary value (key: 2, value: "Two")
Dictionary key 1 - Dictionary value (key: 3, value: "Three")
Dictionary key 2 - Dictionary value (key: 1, value: "One")

Преобразовать в массивы

Вы можете извлечь список пар ключ-значение из данного словаря, чтобы построить отдельные массивы для ключей и значений. Вот пример —

Live Demo

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]

let dictKeys = [Int](someDict.keys)
let dictValues = [String](someDict.values)

print("Print Dictionary Keys")

for (key) in dictKeys {
   print("\(key)")
}
print("Print Dictionary Values")

for (value) in dictValues {
   print("\(value)")
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Print Dictionary Keys
2
3
1
Print Dictionary Values
Two
Three
One

Свойство графа

Вы можете использовать свойство «только для чтения» словаря, чтобы узнать количество элементов в словаре, как показано ниже —

Live Demo

var someDict1:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var someDict2:[Int:String] = [4:"Four", 5:"Five"]

print("Total items in someDict1 = \(someDict1.count)")
print("Total items in someDict2 = \(someDict2.count)")

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Total items in someDict1 = 3
Total items in someDict2 = 2

Пустая недвижимость

Вы можете использовать пустое свойство словаря только для чтения, чтобы узнать, является ли словарь пустым или нет, как показано ниже —

Live Demo

var someDict1:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var someDict2:[Int:String] = [4:"Four", 5:"Five"]
var someDict3:[Int:String] = [Int:String]()

print("someDict1 = \(someDict1.isEmpty)")
print("someDict2 = \(someDict2.isEmpty)")
print("someDict3 = \(someDict3.isEmpty)")

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —