English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderá sobre los conjuntos, cómo crearlos, modificarlos y algunas operaciones comunes en los conjuntos.
En el artículo anteriorArray de SwiftEn este artículo, hemos aprendido cómo crear un array que pueda contener múltiples valores en una lista ordenada.
Pero, si queremos asegurarnos de que una lista solo tenga valores únicos, entonces usamos set (conjunto) en Swift.
Un conjunto es solo un contenedor que puede almacenar varios tipos de valores en una lista desordenada y asegurar que los elementos dentro del contenedor sean únicos (es decir, cada dato solo aparece una vez).
Una lista desordenada significa que no podrá obtener los elementos en el orden definido para los elementos del conjunto.
La principal ventaja de usar un conjunto en lugar de un array es que, cuando necesite asegurarse de que un elemento solo aparezca una vez y la secuencia de los elementos no sea importante.
Los valores almacenados en el conjunto deben ser hashables. Esto significa que deben proporcionar el atributo hashValue. Esto es importante porque los conjuntos son unordered y utilizan hashValue para acceder a los elementos del conjunto
Por defecto, todos los tipos básicos de Swift (como String, Int, Double y Bool) son hashables y se pueden usar como tipos de valores para conjuntos. Pero también puedes crear tipos hashables que se pueden almacenar en conjuntos en Swift
Puedes crear un conjunto vacío especificando el tipo como set y luego especificando el tipo de datos que puede almacenar entre <>
let emptyIntSet:Set = [] print(emptyIntSet)
o
let emptyIntSet:Set = Set() print(emptyIntSet)
Al ejecutar el programa, la salida es:
[ ]
En el programa anterior, declaramos una constante de tipo Set llamada emptyInt, que puede almacenar múltiples valores enteros e inicializarlos con el valor 0
Dado que Swift es un lenguaje de inferencia de tipos, también puedes crear conjuntos sin especificar el tipo de datos, pero debes usar algunos valores para inicializarlos, de modo que el compilador pueda inferir su tipo:
let someIntSet:Set = [1, 2, 3, 4, 5, 6, 7, 8, 9] print(someIntSet)
Al ejecutar el programa, la salida es:
[2, 4, 9, 5, 6, 7, 3, 1, 8]
En el programa anterior, declaramos una constante someIntSet que puede almacenar un conjunto de Integer sin especificar explícitamente el tipo. Sin embargo, necesitamos incluir :Set al definir la variable, de lo contrario Swift nos creará un array
Además, como un array, usamos corchetes [] para 1、2、3、4、5、6、7、8、9 Los valores inicializan el conjunto
Ya sabes, cuando intentas usar print(someIntSet) para imprimir los valores del conjunto, obtienes un orden diferente, diferente al orden de los elementos que ya has definido en el conjunto, porque no define el orden de almacenamiento de los valores. Por lo tanto, el orden de acceso cambia cada vez
let someStrSet:Set = ["ab","bc","cd","de","ab"] print(someStrSet)
Al ejecutar el programa, la salida es:
["de", "ab", "cd", "bc"]
Ya sabes, cuando intentas imprimir los valores de un conjunto como impresión(someIntSet), en el programa anterior, definimos un valor repetido ab en el conjunto. Además. Cuando intentamos acceder a los valores del conjunto utilizando print(someStrSet), los valores repetidos se eliminan automáticamente del conjunto. Por lo tanto, set garantiza que sus elementos sean únicos/Valores.
También puede declarar un conjunto utilizando su tipo personalizado Hashable en Swift.
No se puede usar la sintaxis de índice para acceder a los elementos del conjunto como en un array. Esto se debe a que los conjuntos son desordenados y no tienen índices de acceso.
Por lo tanto, debe usar sus métodos y propiedades o usar for-El bucle in se utiliza para acceder a los elementos del conjunto.
var someStrSet:Set = ["ab", "bc", "cd", "de"] for val in someStrSet { print(val) }
Al ejecutar el programa, la salida es:
de ab cd bc
En el programa anterior, el valor obtenido es diferente en orden de los elementos del conjunto, porque los conjuntos son desordenados, a diferencia de los arrays.
También puede acceder a elementos del conjunto, eliminando directamente valores del conjunto, como se muestra a continuación:
var someStrSet:Set = ["ab", "bc", "cd", "de"] let someVal = someStrSet.remove("cd") print(someVal) print(someStrSet)
Al ejecutar el programa, la salida es:
Optional("cd") ["de", "ab", "bc"]
En el programa anterior, puede ver que el método remove devuelve un valor opcional de cadena. Por lo tanto, se recomienda que realice el siguiente manejo opcional. Para obtener más información sobre los valores opcionales, visiteSwift opcional.
var someStrSet:Set = ["ab", "bc", "cd", "de"] if let someVal = someStrSet.remove("cd") { print(someVal) print(someStrSet) } else { print("no se puede encontrar el elemento para eliminar") }
Al ejecutar el programa, la salida es:
cd ["de", "ab", "bc"]
Puede usar el método insert() de Swift para agregar nuevos elementos a un conjunto.
var someStrSet:Set = ["ab", "bc", "cd", "de"] someStrSet.insert("ef") print(someStrSet)
Al ejecutar el programa, la salida es:
["ab", "de", "cd", "ef", "bc"]
En el programa anterior, utilizamos el método insert() del conjunto para agregar nuevos elementos al conjunto. Dado que los conjuntos son desordenados, la posición de inserción de los elementos es desconocida.
Una de las principales ventajas de usar conjuntos es que se pueden realizar operaciones de conjuntos, como combinar dos conjuntos, determinar qué valores tienen en común dos conjuntos, etc. Estas operaciones son similares a las operaciones de conjuntos en matemáticas.
两个集合a和b的并集是在a或b中 或 在a和b两者中的元素的集合。
let a: Set = [1, 3, 5, 7, 9] let b: Set = [0, 2, 4, 6, 8] print(a.union(b))
Al ejecutar el programa anterior, la salida será:
[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))
Al ejecutar el programa anterior, la salida será:
[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))
Al ejecutar el programa anterior, la salida será:
[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))
Al ejecutar el programa anterior, la salida será:
[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不同") }
Al ejecutar el programa anterior, la salida será:
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))
Al ejecutar el programa anterior, la salida será:
isSubset: true isSuperset: true isStrictSubset: true isDisjointWith: false
Vamos a analizar los métodos utilizados en la declaración print a continuación:
isSubset devuelve true, porque el conjunto b contiene todos los elementos del conjunto a
isSuperset devuelve true, porque b contiene todos los valores de a.
isStrictSubset devuelve true, porque el conjunto b contiene todos los elementos del conjunto a y los conjuntos no son iguales.
isDisjointWith devuelve false, porque a y b tienen algunos valores comunes.
Esta propiedad determina si el conjunto está vacío. Si el conjunto no contiene ningún valor, devuelve true, de lo contrario devuelve false.
let intSet:Set = [21, 34, 54, 12] print(intSet.isEmpty)
Al ejecutar el programa, la salida es:
false
Esta propiedad se utiliza para acceder al primer elemento del conjunto.
let intSet = [21, 34, 54, 12] print(intSet.first)
Al ejecutar el programa, la salida es:
Optional(54)
Dado que Set es un conjunto no ordenado, la propiedad first no garantiza que sea el primer elemento del conjunto. Es probable que obtenga54y otros valores.
Asimismo, puede usar la propiedad last para acceder al último elemento del conjunto.
La función insert() se utiliza para insertar/Añadir elementos.
var intSet:Set = [21, 34, 54, 12] intSet.insert(50) print(intSet)
Al ejecutar el programa, la salida es:
[54, 12, 50, 21, 34]
Esta función devuelve los elementos del conjunto en orden inverso.
var intSet:Set = [21, 22, 23, 24, 25] print(intSet) let reversedSet = intSet.reversed() print(reversedSet)
Al ejecutar el programa, la salida es:
[22, 23, 21, 24, 25] [25, 24, 21, 23, 22]
Esta propiedad devuelve el número total de elementos en la colección.
let floatSet: Set = [10.2, 21.3, 32.0, 41.3] print(floatSet.count)
Al ejecutar el programa, la salida es:
4
Esta función elimina y devuelve el primer valor de la colección.
var strSet: Set = ["ab", "bc", "cd", "de"] let removedVal = strSet.removeFirst() print("removed value is \(removedVal)") print(strSet)
Al ejecutar el programa, la salida es:
removed value is de ["ab", "cd", "bc"]
Del mismo modo, también puede usar la función removeAll para vaciar la colección.