Як ми вже знаємо, масиви у 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 або прототип додатка? Ознайомтеся з нашим портфоліо і зробіть замовлення вже сьогодні!