Словники у Swift

Як ми вже знаємо, масиви у Swift — це колекції, у яких доступ до кожного елементу здійснюється через числовий індекс, наприклад songs[0]. Словники являють собою ще один поширений тип колекції. Від масивів вони відрізняються тим, що дозволяють отримати доступ до значень за спеціальним ключем, який вказав користувач.

Для початку уявімо собі, як ми могли б зберігати інформацію про людину в масиві:

var person =["Taylor", "Alison", "Swift", "December", "taylorswift.com"]

Для того, аби прочитати ім’я людини, нам необхідно використати синтаксис person[1], а щоб дізнатися дату її народження — person[3]. Таке використання масиву спричиняє відразу кілька проблем, наприклад таку: програмісту необхідно пам’ятати всі порядкові номери (індекси), які він привласнив кожному значенню в масиві. Крім того, може виникнути ситуація, коли у якоїсь людини відсутнє значення по батькові, що спричинить хаос у зберіганні даних!

Словник — це колекція елементів одного і того ж типу, для доступу до значень якої використовуються ключі.

Запис словника

У Swift тип словника в повній формі записується як <Key, Value>, де Key — тип значення, яке використовується як ключ словника, а Value — тип значення, яке словник може зберігати для цих ключів.

Ми також можемо записати словник у скороченій формі як [Key: Value]. Хоча обидві форми функціонально ідентичні, коротка форма є кращою, і в подальшому ми будемо використовувати її у роботі, наприклад:

var person =["first":"Taylor", "middle":"Alison", "last":"Swift", "month":"December", "website":"taylorswift.com"]
person["middle"]
person["month"]

Для зручності роботи зі словником доцільно використовувати форматування тексту, наприклад із застосуванням пробілів:

var person =["first":"Taylor",
                "middle":"Alison",
                "last":"Swift",
                "month":"December",
                "website":"taylorswift.com"]
person["middle"]
person["month"]

Зверніть увагу на те, що при введенні нового елемента словника спочатку вказується спеціальний ключ, а потім після двокрапки — його значення. Щоб прочитати зі словника якесь значення, потрібно просто ввести його ключ. Погодьтеся, так працювати з даними набагато простіше і зручніше!

Збереження даних у словнику та їх зміна

Як і у випадку з масивами, словники дозволяють зберігати безліч різних значень за умови, що всі ключі відповідають строковому типу.

При спробі створити словник з двома однаковими ключами Xcode повідомить про помилку. Для створення незмінного словника використовуйте оператор let, в іншому випадку — оператор var.

Ключі використовуються не тільки для отримання значень елементів словника, але і для їх зміни:

var countryDict =["US":"USA", "BEL":"Belarus", "UA":"Ukraine"]// отримати значення елемента
countryDict["BEL"]// поновити значення елемента
countryDict["US"]="United States of America"

Для поновлення значення елемента словника також використовується метод updateValue(). Під час зміни елемента даний метод повертає опціональне старе значення (або nil, якщо значення зі змінюваним ключем не існує).

var countryDict =["US":"USA", "BEL":"Belarus", "UA":"Ukraine"]// поновити значення елемента
countryDict.updateValue(value:"United States of America", forKey:"US")

Цей метод повертає не нове, а старе значення елемента словника.

Для створення нового елемента словника необхідно вказати на новий неіснуючий ключ, передавши йому необхідне значення:

countryDict["TUR"]="Turkey"

Для видалення елемента (пари ключ–значення) достатньо привласнити йому значення nil або використати метод removeValueForKey(), вказавши ключ відповідного елемента:

countryDict["UA"]=nil
countryDict.removeValueForKey("BEL")

При використанні методу removeValueForKey повертається значення елемента, який видаляється.

Якщо спробувати отримати доступ до неіснуючого елементу словника, це не призведе до помилки — Swift просто поверне nil. Така поведінка говорить про те, що будь-яке значення елемента словника, яке повертається в результаті виконання, відповідає опціональному типу.

Для перетворення значення countryDict["US"], що повертається, з типу String? в тип String виконується його примусовий витяг.

Для того, щоб створити порожній словник, його потрібно ініціалізувати значенням без елементів. Це робиться за допомогою конструкції [:], яка є літералом словника, що не має елементів:

var emptyDictionary:[String:Int]=[:]
var AnotherEmptyDictionary: Dictionary<String,Int> =[:]

За допомогою конструкції [:] можна також знищити всі елементи словника, якщо привласнити її словнику як значення:

countryDict =[:]

Значення в словнику зберігаються зовсім не в тому порядку, в якому ми їх туди помістили. Словники — це не масиви, вони не є впорядкованими колекціями. Ми не можемо додати елемент в кінець словника, ми просто створюємо новий елемент, а Swift самостійно вирішує, на яку позицію в даному словнику його помістити.

Словники, як і масиви з наборами, мають велику кількість властивостей і методів. З деякими з них ми вже познайомилися.

Наприклад, властивість count повертає кількість елементів в словнику:

var someDictionary =[1, 2, 3, 4, 5]
someDictionary.count

Якщо властивість count дорівнює нулю, то інша властивість isEmpty повертає true:

var someDictionary:[Int]=[]
someDictionary.count
someDictionary.isEmpty

При необхідності ми можемо отримати всі ключі або всі значення словника за допомогою наступних двох властивостей keys і values:

var countryDict =["US":"USA", "BEL":"Belarus", "UA":"Ukraine"]// отримати всі ключі словника countryDict
var keys = countryDict.keys
// отримати всі значення словника countryDict
var values = countryDict.values

У разі виклику властивостей keys або values Swift повертає не масив, набір чи словник, а значення типу LazyMapCollection. З подібною поведінкою ми зустрічалися раніше, коли використовували функцію reverse() для зміни порядку проходження елементів масиву на зворотній.

Сьогодні ми познайомилися зі ще одним типом колекції, варіантами запису словників, а також отриманням та видаленням даних із них.

Джерело: Hacking with Swift

Читати ще: Основи Swift. Умовні оператори

Потрібен MVP, розробка під iOS, Android або прототип додатка? Ознайомтеся з нашим портфоліо і зробіть замовлення вже сьогодні!