Основы Swift / 5.5. Множества 2 - Получение доступа и изменение


Видео


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

Чтобы узнать количество элементов в множестве, проверьте свойство доступное-только-для-чтения count:
@{5.5\1\1}
                    
var favoriteGenres: Set = ["Рок", "Классика", "Неоклассика"]
print("У меня есть \(favoriteGenres.count) любимых жанров музыки.")
// Выведет "У меня есть 3) любимых жанров музыки."
                    
                
Проверка множества на пустоту
Используйте Булево свойство isEmpty в качестве короткой формы для проверки того, что свойство count равно 0:
@{5.5\1\2}
                    
if favoriteGenres.isEmpty {
    print("Я люблю жить в тишине.")
} else {
    print("У меня есть определённые музыкальные предпочтения.")
}
// Выводит "У меня есть определённые музыкальные предпочтения."
                    
                
Добавление новых элементов в множество
Вы можете добавить новый элемент в множество с помощью вызова метода insert(_:):
@{5.5\1\3}
                    
favoriteGenres.insert("Джаз")
// favoriteGenres теперь содержит 4 элемента
                    
                
Удаление элемента из множества
Вы можете убрать элемента из множества, вызвав метод remove(_:), который убирает элемент из множества и возвращает убранное значение или nil, если множество его не содержит. Опциональность возвращаемого значения связана с тем, что множество могло и не содержать такого элемента.
Удаление всех элементов из множества
С другой стороны, все элементы в множестве могут быть убраны с помощью метода removeAll(). Этот метод, очевидно, ничего не возвращает.
@{5.5\1\4}
                    
if let removedGenre = favoriteGenres.remove("Рок") {
    print("\(removedGenre)? Я закончил с ним.")
} else {
    print("Мне никогда это и не нравилось.")
}
// Выведет "Рок? Я закончил с ним."

if let removedGenre = favoriteGenres.remove("Хард рок") {
    print("\(removedGenre)? Я закончил с ним.")
} else {
    print("Мне никогда это и не нравилось.")
}
// Выведет "Мне никогда это и не нравилось."
                    
                
Проверка на наличие значения
Для проверки того, содержит ли множество конкретный элемент, используйте метод contains(_:).
@{5.5\1\5}
                    
if favoriteGenres.contains("Попса") {
    print("Я люблю быть как все.")
} else {
    print("Здесь неособенно попсово.")
}
// Выведет "Здесь неособенно попсово."
                    
                
Итерирование через множество
Вы можете итерироваться через значения в множестве с помощью цикла for-in:
@{5.5\1\6}
                    
for genre in favoriteGenres {
    print("\(genre)")
}
                    
                
Упорядочивание множества
Тип Set в Swift не имеет заданного порядка. Для итерирования по значениям множества в определённом порядке используйте метод sorted(), который возвращает элементы множества в виде массива, отсортированного с помощью оператора <.
@{5.5\1\7}
                    
for genre in favoriteGenres.sorted() {
    print("\(genre)")
}
                    
                
Уникальность элементов множества
А теперь попробуем добавить в множество что-нибудь, что уже в нём есть:
@{5.5\2}
                    
var favoriteGenres: Set = ["Рок", "Классика", "Неоклассика"]
favoriteGenres.insert("Рок")
print(favoriteGenres)
                    
                
Как видим, ошибки не будет, но множество останется прежним. Кроме того, можно заметить, что к элементам множества нельзя получить доступ по индексу, так как множество не сохраняет порядок элементов.
Выполнение операций над множествами
Вы можете эффективно выполнять фундаментальные операции над множествами, такие как объединение двух множеств вместе, определение общих значений двух множеств, или определения того, содержат ли два множества все одинаковые, некоторые одинаковые или никакие одинаковые значения.

Иллюстрация отображает два множества - a и b - с представлением различных операций над множествами, показанные закрашенными регионами.
Рисунок 5.1.1
Фундаментальные операции над множествами
  • Используйте метод intersection(_:) для создания нового множества только со значениями, которые являются общими для обоих множеств.
  • Используйте метод symmetricDifference(_:) для создания нового множества только со значениями, которые содержатся в обоих множествах, но не являются общими для обоих множеств.
  • Используйте метод union(_:) для создания нового множества только со значениями из обоих множеств.
  • Используйте метод subtracting(_:) для создания нового множества со значениями, которых нет в определённом множестве.
@{5.5\3}
                    
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersection(evenDigits).sorted()
// []
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]
                    
                
Принадлежность множеств и их эквивалентность
Иллюстрация отображает три множества - a, b и c - с перекрывающимися областями, отображающими элементы, общие для множеств. Множество a - это надмножество для множества b, так как a содержит все элементы из множества b. Напротив, множество b - подмножество множества a, так как все элементы в b так же содержатся в a. Множества b и c являются взаимоисключающими друг относительно друга, так как у них нет общих элементов.
Рисунок 5.5.2
Принадлежность множеств и их эквивалентность 2
  • Используйте оператор равенства (==) для определения, содержат ли два множества одни и те же значения.
  • Используйте метод isSubset(of:) для определения того, все ли значения одного множества содержатся в определённом множестве.
  • Используйте метод isSuperset(of:) для определения того, все ли значения одного множества содержатся в определённом множестве.
  • Используйте методы isStrictSubset(of:) и isStrictSuperset(of:) для определения того, является ли множество подмножеством или надмножеством, но без совпадения с конкретным множеством.
  • Используйте метод isDisjoint(with:) для определения того, что два множества не имеют никаких общих элементов.
@{5.5\4}
                    
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]

houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true