Урок 9. Словари

1 Ноября 2022

Словарь – это тип коллекции, представляющий собой набор пар ключ и значение [kay: value]

Давайте создадим один словарь с одной парой:

// Словарь с ключами целых чисел и строковыми значениями

               kay value

let integers = [1: “one”]

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

				
					// Словарь с ключами целых чисел и строковыми значениями
let integers = [1: "one", 2: "two", 3: "three"]
				
			

Таким образом через запятую вы можете добавлять любое количество пар. 

Давайте посмотрим на тип данного словаря (зажимаем клавишу option и кликаем по свойству, если окно не появляется то следует запустить playground):

Вы можете видеть что все ключи имеют тип Int, а все значения тип String. 

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

Первая пара будет иметь тип [String: String] тогда как вторая и третья тип [Int: String] это разные типы данных, поэтому компилятор нам выдает ошибку. 

Обратите внимание,  что ключи и значения могут быть любых типов. 

Давайте создадим еще пару словарей:

// Словарь с ключами-строками и значениями-целыми числами

               kay  value

let people = [“Anna”: 32, “Bob”: 45, “Charlie”: 60]

 

// Словарь с числовыми ключами типа Double и значениями числовых массивов

                      kay    value    kay    value    kay    value

let  dictOfnumbers = [1.0: [1, 2, 3], 2.5: [4, 5, 6], 3.14: [7, 8, 9]]

Ну и давайте посмотрим на тип данных каждого свойства:

Как вы видите в качестве ключа и в качестве значения могут выступать любые типы данных даже ваши кастомные, но об этом вы узнаете чуть позже. 

Ключи в словаре должны быть уникальными, то есть ты не сможешь создать словарь с одинаковыми ключами

Давайте создадим словарь с одинаковыми ключами и значениями:

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

Ошибка пропадает. В отличие от ключей, значения могут повторятся. 

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

Достать значение по ключу

Также как и в массиве, вы можете достать любое из значений словаря по его ключу:
				
					let people = ["Anna": 32, "Bob": 45, "Charlie": 60]

people["Anna"]
				
			

если мы посмотрим с права, то увидим значение 32

А если мы видим это значение с права, то мы это значение можем использовать, например присвоить новому свойству:

				
					let people = ["Anna": 32, "Bob": 45, "Charlie": 60]
let age = people["Anna"]
				
			

Свойство age будет иметь тип Int, потому что по факту мы взяли значение по ключу Anna и присвоили его новому свойству. 

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

Мы присвоили новое значение по ключу Anna и оно равно теперь 44, хотя изначально было 32.

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


Иногда в разработке необходимо создать пустой словарь, что бы в дальнейшем его наполнить данными:

				
					let dictionaryOne: [Int: String] = [:]
let dictionaryTwo = [Int: String]()
				
			

Это два способа создать пустой словарь, можно использовать любой, какой ближе к сердцу. 

Методы Словаря

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

count – как вы помните это свойство возвращает количество пар ключ-значение в словаре 

В словаре people находится три пары ключа и значения.

isEmpty – возвращает true если в словаре нет ни одного элемента, то есть если он пустой. И false если элементы все таки есть.

так как в словаре есть элементы, то нам вернулось false.

updateValue(_: forKey: ) – этот метод обновляет значение для указанного ключа, и возвращает старое значение. 

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

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

Тип значения стал String. 

Давайте теперь посмотрим как отработает этот метод, для каждого из словарей: 

Мы с вами обновили значение “one” на “two” по ключу 2, и словарь теперь содержит новое значение, но сам метод updateValue вернул нам “one”, а это значит мы можем его использовать в дальнейшем, если присвоим результат свойству:
				
					let oneNumber = integers.updateValue("two", forKey: 2)
				
			

Угадайте какой тип данных имеет данное свойство?! Правильно это String, потому что мы присвоили значение, которое вернул метод. 

Еще один очень полезный метод removeValue(forKey:) , он удаляет пару ключ-значение для указанного ключа, давайте снова обратимся к примеру

Вы можете видеть, что мы удалили пару по ключу “Bob”, при этом если мы видим с права значение 45, то метод removeValue не только удаляет пару, но и возвращает значение по указанному ключу, а это значит что мы это значение можем присвоить свойству, и как то использовать:

				
					let age = people.removeValue(forKey: "Bob")
				
			

свойство age будет целым числом равным 45. 

Этих методов еще очень много, и каждый из них нет смысла рассматривать, главное уловить суть, что у коллекций есть методы и свойства, которые можно использовать. Мы с вами рассмотрели самые распространенные.

Давайте подведем итог. 

Словарь это не упорядоченная коллекция (элементы располагаются хаотично), ключи словаря должны быть уникальными, то есть не повторятся, а значения могут повторятся. При этом все ключи должны быть одного типа, так же как и значения должны быть одного типа, но тип ключа может отличатся от типа значения.

 

Поддержите наш проект, и помогите изменить подход к обучению!

Развивайся вместе с нами

Поддержите наш проект, и помогите изменить подход к обучению!

Address List

Social Networks

Поддержите наш проект, и помогите изменить подход к обучению!