English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве вы узнаете о множествах, создании множеств, изменении множеств и некоторых обычных операциях с множествами.
В предыдущейSwift массивВ этой статье мы рассмотрели, как создавать массивы, которые могут содержать несколько значений в упорядоченном списке.
Но если мы хотим обеспечить, чтобы список содержал только уникальные значения, то мы используем множество в Swift.
Множество является контейнером, который может хранить значения различных типов данных в неупорядоченном списке и обеспечивать уникальность элементов (т.е. каждый элемент встречается только один раз).
Неупорядоченный список означает, что вы не сможете получить элементы в порядке, в котором они определены в множестве.
Основное преимущество использования множества вместо массива заключается в том, что когда вам нужно обеспечить, чтобы элемент出现过 только один раз, и порядок элементов не важен.
Значения, хранящиеся в множестве, должны быть хэшируемыми. Это означает, что они должны предоставлять свойство hashValue. Это очень важно, так как множество не упорядочено и использует hashValue для доступа к элементам множества.
По умолчанию, все основные типы данных Swift (например, String, Int, Double и Bool) являются хэшируемыми и могут использоваться в качестве типовых значений множества. Однако, вы также можете создавать хэшируемые типы данных, которые можно хранить в множестве.
С помощью указания типа множества и типа данных, которые могут храниться в <> (точки с запятой), можно создать пустое множество.
let emptyIntSet:Set = [] print(emptyIntSet)
или
let emptyIntSet:Set = Set() print(emptyIntSet)
Когда вы запустите этот程序, вывод будет следующим:
В上面的程序е, мы объявили константу типа Set под именем emptyInt, которая может хранить несколько целых значений и инициализироваться значением 0.
Поскольку Swift является языком с типовой инференцией, вы также можете создать множество set, не указывая тип данных, но необходимо использовать некоторые значения для инициализации, чтобы компилятор мог определить его тип:
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) для вывода значений множества, вы получите другой порядок, отличный от порядка, который вы определили в множестве, потому что значения хранятся без определенного порядка. Таким образом, порядок доступа к ним изменяется каждый раз.
let someStrSet:Set = ["ab","bc","cd","de","ab"] print(someStrSet)
Когда вы запустите этот程序, вывод будет следующим:
["de", "ab", "cd", "bc"]
Вы уже знаете, что когда вы пытаетесь напечатать значения множества в качестве print(someIntSet), в вышеупомянутой программе мы определили повторяющийся элемент ab в множестве. Также. Когда мы пытаемся использовать print (someStrSet) для доступа к значениям множества, повторяющиеся значения автоматически удаляются из множества. Таким образом, множество гарантирует уникальность элементов/значений.
Вы также можете в Swift использовать свои собственные пользовательские типы Hashable для объявления множеств.
Нельзя использовать синтаксис индексации для доступа к элементам множества, как к массиву. Это потому, что множество не упорядочено и не имеет индексов для доступа к элементам.
Таким образом, вам нужно использовать его методы и свойства или использовать цикл for-in, чтобы доступ к элементам множества.
var someStrSet:Set = ["ab", "bc", "cd", "de"] for val in someStrSet { print(val) }
Когда вы запустите этот程序, вывод будет следующим:
de ab cd bc
В上面的 программе, мы получили val, который отличается от порядка элементов множества, потому что множество и массив различаются, они не упорядочены.
Вы также можете доступ к элементам множества, напрямую удаляя значения из множества, как показано ниже:
var someStrSet:Set = ["ab", "bc", "cd", "de"] let someVal = someStrSet.remove("cd") print(someVal) print(someStrSet)
Когда вы запустите этот程序, вывод будет следующим:
Optional("cd") ["de", "ab", "bc"]
В вышеуказанном примере вы можете увидеть, что метод remove() возвращает опциональную строку. Поэтому рекомендуется выполнить следующую опциональную обработку. Чтобы узнать больше о опционах, пожалуйста, посетитеОпциональный Swift.
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 для добавления нового элемента в множество.
var someStrSet:Set = ["ab", "bc", "cd", "de"] someStrSet.insert("ef") print(someStrSet)
Когда вы запустите этот程序, вывод будет следующим:
["ab", "de", "cd", "ef", "bc"]
В вышеуказанном примере мы используем метод insert() для добавления новых элементов в множество. Поскольку множество неорядочное,位置 inserting элементов не известен.
Одна из основных优点 использования множеств - это возможность выполнения операций с множествами, таких как объединение двух множеств, определение общих значений и т.д. Эти операции подобны операциям с множествами в математике.
Объединение двух множеств 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]
Объединение двух множеств 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.
Разность двух множеств 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].
Симметричное разность множеств 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.
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:) - этот метод определяет, не имеют ли два множества общих значений.
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 имеют некоторые общие значения.
Этот атрибут определяет, пуст ли набор. Если набор не содержит никаких значений, он возвращает true, в противном случае возвращает false.
let intSet = [21, 34, 54, 12] print(intSet.isEmpty)
Когда вы запустите этот程序, вывод будет следующим:
false
Этот атрибут используется для доступа к первому элементу набора.
let intSet = [21, 34, 54, 12] print(intSet.first)
Когда вы запустите этот程序, вывод будет следующим:
Optional(54)
Поскольку Set является неупорядоченным набором, атрибут first не гарантирует, что это первый элемент набора. Вы, возможно, получите значение, отличное от 54.
Таким же образом, вы можете использовать атрибут last для доступа к последнему элементу набора.
Функция insert() используется для вставки/добавления элементов в набор.
var intSet:Set = [21, 34, 54, 12] intSet.insert(50) print(intSet)
Когда вы запустите этот程序, вывод будет следующим:
[54, 12, 50, 21, 34]
Эта функция возвращает элементы набора в обратном порядке.
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]
Этот атрибут возвращает общее количество элементов в наборе.
let floatSet:Set = [10.2, 21.3, 32.0, 41.3] print(floatSet.count)
Когда вы запустите этот程序, вывод будет следующим:
4
Эта функция удаляет и возвращает первый элемент из множества.
var strSet:Set = ["ab", "bc", "cd", "de"] let removedVal = strSet.removeFirst() print("удаленное значение is \(removedVal)") print(strSet)
Когда вы запустите этот程序, вывод будет следующим:
Удаленный значение is de ["ab", "cd", "bc"]
Таким же образом, вы также можете использовать функцию removeAll для удаления всех элементов из множества.