English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift базовый курс

Операторы Swift

Swift управление потоком

Swift множество

Swift функция

Swift продвинутый

Множества (Set) в Swift

В этом руководстве вы узнаете о множествах, создании множеств, изменении множеств и некоторых обычных операциях с множествами.

В предыдущейSwift массивВ этой статье мы рассмотрели, как создавать массивы, которые могут содержать несколько значений в упорядоченном списке.

Но если мы хотим обеспечить, чтобы список содержал только уникальные значения, то мы используем множество в Swift.

Что такое множество?

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

Неупорядоченный список означает, что вы не сможете получить элементы в порядке, в котором они определены в множестве.

Основное преимущество использования множества вместо массива заключается в том, что когда вам нужно обеспечить, чтобы элемент出现过 только один раз, и порядок элементов не важен.

Значения, хранящиеся в множестве, должны быть хэшируемыми. Это означает, что они должны предоставлять свойство hashValue. Это очень важно, так как множество не упорядочено и использует hashValue для доступа к элементам множества.

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

Как声明 множество в Swift?

С помощью указания типа множества и типа данных, которые могут храниться в <> (точки с запятой), можно создать пустое множество.

Пример 1: Объявление пустого множества

let emptyIntSet:Set = []
print(emptyIntSet)

или

let emptyIntSet:Set = Set()
print(emptyIntSet)

Когда вы запустите этот程序, вывод будет следующим:

В上面的程序е, мы объявили константу типа Set под именем emptyInt, которая может хранить несколько целых значений и инициализироваться значением 0.

Поскольку Swift является языком с типовой инференцией, вы также можете создать множество set, не указывая тип данных, но необходимо использовать некоторые значения для инициализации, чтобы компилятор мог определить его тип:

Пример 2: объявление множества с определенными значениями

let someIntSet:Set = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(someIntSet)

Когда вы запустите этот程序, вывод будет следующим:

[2, 4, 9, 5, 6, 7, 3, 1, 8]

В вышеупомянутой программе мы объявили константу someIntSet, которая может хранить множество Integer, не требуя явного указания типа. Однако, нам нужно добавить :Set при определении переменной, в противном случае Swift создаст для нас массив.

Кроме того, как массив, мы используем [] скобки для инициализации множества значениями 1, 2, 3, 4, 5, 6, 7, 8, 9.

Вы уже знаете, что когда вы пытаетесь использовать print(someIntSet) для вывода значений множества, вы получите другой порядок, отличный от порядка, который вы определили в множестве, потому что значения хранятся без определенного порядка. Таким образом, порядок доступа к ним изменяется каждый раз.

Пример 3: объявление множества с повторяющимися значениями

let someStrSet:Set = ["ab","bc","cd","de","ab"]
print(someStrSet)

Когда вы запустите этот程序, вывод будет следующим:

["de", "ab", "cd", "bc"]

Вы уже знаете, что когда вы пытаетесь напечатать значения множества в качестве print(someIntSet), в вышеупомянутой программе мы определили повторяющийся элемент ab в множестве. Также. Когда мы пытаемся использовать print (someStrSet) для доступа к значениям множества, повторяющиеся значения автоматически удаляются из множества. Таким образом, множество гарантирует уникальность элементов/значений.

Вы также можете в Swift использовать свои собственные пользовательские типы Hashable для объявления множеств.

Как доступ к элементам множества в Swift?

Нельзя использовать синтаксис индексации для доступа к элементам множества, как к массиву. Это потому, что множество не упорядочено и не имеет индексов для доступа к элементам.
Таким образом, вам нужно использовать его методы и свойства или использовать цикл for-in, чтобы доступ к элементам множества.

Пример 4: доступ к элементам множества с помощью for...in

var someStrSet:Set = ["ab", "bc", "cd", "de"]
for val in someStrSet {
    print(val)
}

Когда вы запустите этот程序, вывод будет следующим:

de
ab
cd
bc

В上面的 программе, мы получили val, который отличается от порядка элементов множества, потому что множество и массив различаются, они не упорядочены.

Вы также можете доступ к элементам множества, напрямую удаляя значения из множества, как показано ниже:

Пример 5: доступ к элементам множества с помощью remove()

var someStrSet:Set = ["ab", "bc", "cd", "de"]
let someVal = someStrSet.remove("cd")
print(someVal)
print(someStrSet)

Когда вы запустите этот程序, вывод будет следующим:

Optional("cd")
["de", "ab", "bc"]

В вышеуказанном примере вы можете увидеть, что метод remove() возвращает опциональную строку. Поэтому рекомендуется выполнить следующую опциональную обработку. Чтобы узнать больше о опционах, пожалуйста, посетитеОпциональный Swift.

Пример 6: Опциональное обработка remove()

var someStrSet:Set = ["ab", "bc", "cd", "de"]
if let someVal = someStrSet.remove("cd") {
    print(someVal)
    print(someStrSet)
} else {
    print("cannot find element to remove")
}

Когда вы запустите этот程序, вывод будет следующим:

cd
["de", "ab", "bc"]

Как добавить новый элемент в множество?

Вы можете использовать метод insert() в Swift для добавления нового элемента в множество.

Пример 7: Добавление нового элемента с помощью insert()

var someStrSet:Set = ["ab", "bc", "cd", "de"]
someStrSet.insert("ef")
print(someStrSet)

Когда вы запустите этот程序, вывод будет следующим:

["ab", "de", "cd", "ef", "bc"]

В вышеуказанном примере мы используем метод insert() для добавления новых элементов в множество. Поскольку множество неорядочное,位置 inserting элементов не известен.

Операции с множествами

Одна из основных优点 использования множеств - это возможность выполнения операций с множествами, таких как объединение двух множеств, определение общих значений и т.д. Эти операции подобны операциям с множествами в математике.

1. Объединение

Объединение двух множеств a и b - это множество элементов, которые встречаются в a или b или в обоих.

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 2, 4, 6, 8]
print(a.union(b))

Когда вы запустите вышеуказанную программу, вывод будет:

[8, 2, 9, 4, 5, 7, 6, 3, 1, 0]

2. Объединение

Объединение двух множеств a и b - это множество, содержащее все элементы a, которые также都属于 b.

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
print(a.intersection(b))

Когда вы запустите вышеуказанную программу, вывод будет:

[7, 3]

Таким образом, print(a.intersection(b)) выводит новый набор с значением [7, 3] Существует в обоих множествах a и b.

3. Разность

Разность двух множеств a и b, она содержит все элементы a, но удаляет элементы, которые также принадлежат b.

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
print(a.subtracting(b))

Когда вы запустите вышеуказанную программу, вывод будет:

[5, 9, 1]

Таким образом, print(a.subtracting(b)) выводит набор с значением[ новое множество [5, 9, 1].

4. Симметричное разность множеств

Симметричное разность множеств a и b - это множество всех элементов, которые находятся в одном из множеств, но не в обоих.

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
print(a.symmetricDifference(b))

Когда вы запустите вышеуказанную программу, вывод будет:

[5, 6, 8, 0, 1, 9]

Таким образом, print(a.symmetricDifference(b)) выводит множество значений[ новое множество [5, 6, 8, 0, 1, 9].

Отношения членства и операции равенства

Равенство множеств

Вы можете использовать оператор == для проверки, содержат ли два множества одинаковые элементы. Если два множества содержат одинаковые элементы, то возвращает true, в противном случае false.

Пример 5: операции с равенством множеств

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
let c:Set = [9, 7, 3, 1, 5]
if a == b {
    print("a и b равны")
} else {
    print("a и b различаются")
}
if a == c {
    print("a и c равны")
} else {
    print("a и c различаются")
}

Когда вы запустите вышеуказанную программу, вывод будет:

a и b различаются
a и c равны

Отношения членства в множестве

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

  • isSubset(of:) - этот метод определяет, содержатся ли все значения одного множества в заданном множестве.

  • isSuperset(of:) - этот метод определяет, содержит ли множество все значения, содержащиеся в заданном множестве.

  • isStrictSubset(of:) или isStrictSuperset(of:) - этот метод определяет, является ли одно множество подмножеством или的超множеством другого, но не равным ему.

  • isDisjoint(with:) - этот метод определяет, не имеют ли два множества общих значений.

Пример 6: операции с членством в множестве

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 1, 7, 6, 8, 9, 5]
print("isSubset:", a.isSubset(of: b))
print("isSuperset:", b.isSuperset(of: a))
print("isStrictSubset:", a.isStrictSubset(of: b))
print("isDisjointWith:", a.isDisjoint(with: b))

Когда вы запустите вышеуказанную программу, вывод будет:

isSubset: true
isSuperset: true
isStrictSubset: true
isDisjointWith: false

Давайте проанализируем методы, используемые в следующем примере print()

  • isSubset возвращает true, потому что набор b содержит все элементы набора a

  • isSuperset возвращает true, потому что b содержит все значения набора a.

  • isStrictSubset возвращает true, потому что набор b содержит все элементы набора a, и два набора не равны.

  • isDisjointWith возвращает false, потому что a и b имеют некоторые общие значения.

Внутренние функции и атрибуты набора

1. isEmpty атрибут

Этот атрибут определяет, пуст ли набор. Если набор не содержит никаких значений, он возвращает true, в противном случае возвращает false.

Пример 7: как работает функция isEmpty?

let intSet = [21, 34, 54, 12]
print(intSet.isEmpty)

Когда вы запустите этот程序, вывод будет следующим:

false

2.first атрибут

Этот атрибут используется для доступа к первому элементу набора.

Пример 8: как работает функция first?

let intSet = [21, 34, 54, 12]
print(intSet.first)

Когда вы запустите этот程序, вывод будет следующим:

Optional(54)

Поскольку Set является неупорядоченным набором, атрибут first не гарантирует, что это первый элемент набора. Вы, возможно, получите значение, отличное от 54.

Таким же образом, вы можете использовать атрибут last для доступа к последнему элементу набора.

3.insert функция - вставка элементов

Функция insert() используется для вставки/добавления элементов в набор.

Пример 9: как работает функция insert()?

var intSet:Set = [21, 34, 54, 12]
intSet.insert(50)
print(intSet)

Когда вы запустите этот程序, вывод будет следующим:

[54, 12, 50, 21, 34]

4.reversed() - переворачивает набор

Эта функция возвращает элементы набора в обратном порядке.

Пример 10: как работает функция reversed()?

var intSet:Set = [21, 22, 23, 24, 25]
print(intSet)
let reversedSet = intSet.reversed()
print(reversedSet)

Когда вы запустите этот程序, вывод будет следующим:

[22, 23, 21, 24, 25]
[25, 24, 21, 23, 22]

5.count - возвращает общее количество элементов в наборе

Этот атрибут возвращает общее количество элементов в наборе.

Пример 11: как работает функция count?

let floatSet:Set = [10.2, 21.3, 32.0, 41.3]
print(floatSet.count)

Когда вы запустите этот程序, вывод будет следующим:

4

6. removeFirst - Удаляет и возвращает первый элемент из множества

Эта функция удаляет и возвращает первый элемент из множества.

Пример 12: как работает removeFirst?

var strSet:Set = ["ab", "bc", "cd", "de"]
let removedVal = strSet.removeFirst()
print("удаленное значение is \(removedVal)")
print(strSet)

Когда вы запустите этот程序, вывод будет следующим:

Удаленный значение is de
["ab", "cd", "bc"]

Таким же образом, вы также можете использовать функцию removeAll для удаления всех элементов из множества.