Основы Swift / 5.4. Множества 1 - Основы


Видео


Множества
Множества хранят уникальные значения одного типа в коллекции заданного порядка. Вы можете использовать множество вместо массива, когда порядок элементов не важен, или если когда нужно быть уверенными в том, что элемент появится всего один раз.
Set и NSSet
Тип Set из Swift взаимозаменяем с классом NSSet из Foundation.
Хэш-значения для типов-множеств
Тип должен быть хэшируемым для возможности хранения в массиве: тип должен предоставить способ вычислить значение хэша для себя самого. Хэш-значение - это число типа Int, которое одинаково для всех равных объектов, которые эквивалентны: если a == b, то следовательно a.hashValue == b.hashValue.

Все базовые типы Swift (такие как String, Int, Double и Bool) хэшируемы по-умолчанию и могут быть использованы в качестве значений множества или ключей словаря. Кейсы перечислений без ассоциированных значений так же хэшируемы по-умолчанию. [О перечислениях будет сказано подробнее позднее. Когда-нибудь потом мы рассмотрим и создание собственных типов для множеств.]

Тип множества в Swift записывается как Set<Element>, где Element - это тип, который может хранить множество. В отличие от массивов множества не имеют сокращённой формы записи.
Создание пустого множества
Вы можете создать пустое множество определённого типа с использованием синтаксиса конструктора [понятия конструктора и инициализатора равнозначны в данном руководстве]:
@{5.4\1\1}
                    
var workers = Set<String>()
print("workers имеет тип Set<Character> со следующим количеством элементов: \(letters.count).")
// Выводит "workers имеет тип Set<Character> со следующим количеством элементов: 0."
                    
                
Тип переменной letters выведен как Set<String> из типа конструктора.
Создание пустого множества с помощью литерала пустого массива
Если контекст предоставляет информацию о типе или если величина уже типизирована, то Вы можете создать пустое множество с помощью литерала пустого массива:
@{5.4\1\2}
                    
workers.insert("Альфия")
// workers теперь содержит один элемент типа String
workers = []
// workers теперь пустое множество, но всё так же имеет тип Set<String>                    
                
Создание множества с помощью литерала массива
Вы также можете инициализировать множество с помощью литерала массива в качестве более короткого пути написания одного или более значений в качестве коллекции-множества.

Пример ниже показывает создание множества с названием favoriteGenres для хранения значений типа String:
@{5.4\2}
                    
var favoriteGenres: Set<String> = ["Рок", "Классика", "Неоклассика"]
// favoriteGenres был инициализирован тремя начальными значениями
                    
                
Переменная favoriteGenres объявлена как "множество значений типа String", что записывается как Set<String>. Так как это конкретное множество задано как множество типа String, то в нём можно хранить только строковые значения. Здесь множество favoriteGenres инициализирован тремя значениями String ("Рок", "Классика"и "Неоклассика"), что записывается с помощью литерала массива.

Множество favoriteGenres объявлено в качестве переменной, а не константы, так как больше элементов может быть добавлено в него или убрано в примерах далее.
Более короткое задание множества
Тип множества не может быть выведен из литерала массива самостоятельно, так что тип Set должен быть явно указан. Однако ввиду типовыведения Swift Вы не обязаны указывать тип множества явно, если Вы инициализируете его с помощью литерала массива, содержащего значения одного типа. Инициализация favoriteGenres в таком случае могла бы быть объявлена короче:
@{5.4\3}
                    
var favoriteGenres: Set = ["Рок", "Классика", "Неоклассика"]
                    
                
Так как все значения в литерале массива имеют один тип, то Swift может вывести, что тип Set<String> - это корректный тип для использования с переменной favoriteGenres.