Swift Sets: ¿Cómo se usa y por qué? (Con ejemplos)

En este tutorial, aprenderá sobre conjuntos, cómo crear conjuntos, modificarlos y algunas operaciones comunes en conjuntos.

En el artículo anterior de Swift Arrays, aprendimos sobre cómo crear una matriz que puede contener varios valores en una lista ordenada.

Pero, si tenemos que asegurarnos de que una lista pueda contener un valor solo una vez, usamos un conjunto en Swift.

¿Qué es un set?

Sets es simplemente un contenedor que puede contener múltiples valores de tipo de datos en una lista desordenada y asegura un elemento único en el contenedor (es decir, cada dato aparece solo una vez).

La lista desordenada significa que no obtendrá los elementos en el mismo orden en que los definió en el Conjunto.

La principal ventaja de usar Conjuntos sobre matrices es cuando necesita asegurarse de que un elemento solo aparece una vez y cuando el orden de los elementos no es importante.

Los valores almacenados en un conjunto deben ser hash . Esto significa que debe proporcionar una propiedad hashValue. Esto es importante porque los conjuntos están desordenados y se usa hashValue para acceder a los elementos de los conjuntos.

Todos los tipos básicos de Swift (como String, Int, Double, y Bool) son hashable por defecto, y se puede utilizar como tipos de valores establecidos. Sin embargo, también puede crear su tipo Hashable en Swift que se puede almacenar en un conjunto.

¿Cómo declarar un set en Swift?

Puede crear un conjunto vacío especificando el tipo como Conjunto seguido del tipo de Datos que puede almacenar.

Ejemplo 1: declaración de un conjunto vacío

 let emptyIntSet:Set = () print(emptyIntSet) 

O

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

Cuando ejecute el programa, la salida será:

 ()

En el programa anterior, hemos declarado una constante emptyIntSet de tipo Setque puede almacenar múltiples valores de números enteros e inicializados con valores 0.

Dado que Swift es un lenguaje de inferencia de tipos, también puede crear un conjunto directamente sin especificar el Tipo de datos, pero debe inicializar con algunos valores para que el compilador pueda inferir su tipo como:

Ejemplo 2: declarar un conjunto con algunos valores

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

Cuando ejecute el programa, la salida será:

 (2, 4, 9, 5, 6, 7, 3, 1, 8)

En el programa anterior, hemos declarado una constante someIntSet que puede almacenar conjuntos de Integer sin especificar el tipo explícitamente. Sin embargo, necesitamos escribir :Setal definir la variable, de lo contrario Swift creará una matriz para nosotros.

Además, como matrices, hemos inicializado el conjunto con valores 1, 2, 3, 4, 5, 6, 7, 8, 9 usando los ()corchetes.

Como ha aprendido, cuando intente imprimir los valores dentro del conjunto como print(someIntSet), obtendrá los resultados en un orden diferente al que definió los elementos en el conjunto porque almacena valor sin un orden definido. Por tanto, cada vez que accedes al pedido cambia.

Ejemplo 3: declaración de un conjunto con valores duplicados

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

Cuando ejecute el programa, la salida será:

 ("de", "ab", "cd", "bc")

En el programa anterior, hemos definido un valor duplicado ab en el conjunto. Y. cuando intentamos acceder al valor dentro del conjunto usando print(someStrSet), el valor duplicado se elimina automáticamente del conjunto. Por lo tanto, set garantiza elementos / valores únicos dentro de él.

También puede declarar un conjunto con su propio tipo Hashable personalizado en Swift. Para obtener más información, visite Swift Hashable.

¿Cómo acceder a los elementos del conjunto en Swift?

No puede acceder a elementos de un conjunto utilizando la sintaxis de subíndice como matrices. Esto se debe a que los conjuntos están desordenados y no tienen índices para acceder a los elementos.

Por lo tanto, debe acceder al conjunto usando sus métodos y propiedades o usando bucles for-in.

Ejemplo 4: acceder a elementos de un conjunto

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

Cuando ejecute el programa, la salida será:

 de ab cd bc 

En el programa anterior, obtenemos el valor en un orden diferente al de los elementos de un conjunto porque los conjuntos están desordenados a diferencia de las matrices.

También puede acceder al elemento de un conjunto eliminando directamente el valor del conjunto como se muestra a continuación:

Ejemplo 5: Acceder a elementos de un conjunto usando remove ()

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

Cuando ejecute el programa, la salida será:

 Opcional ("cd") ("de", "ab", "bc") 

En el programa anterior, puede ver que el método remove devuelve una cadena opcional. Por lo tanto, se recomienda que realice un manejo opcional como se indica a continuación. Para obtener más información sobre los opcionales, visite Swift Optionals.

Ejemplo 6: manejo opcional para 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") ) 

Cuando ejecute el programa, la salida será:

 cd ("de", "ab", "bc") 

¿Cómo agregar un nuevo elemento en un conjunto?

Puede agregar un nuevo elemento a un conjunto usando el insert()método en Swift.

Ejemplo 7: agregar un nuevo elemento usando insert ()

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

Cuando ejecute el programa, la salida será:

 ("ab", "de", "cd", "ef", "bc")

In the above program, we used the set's insert() method to add a new element to a set. Since, sets are unordered, the position of the inserted element isn't known.

Set Operations

Another main advantage of using Sets is you can perform set operations such as combining two sets together, determining which values two sets have in common etc. This operations are similar to the Set operation in Mathematics.

1. Union

The union of two sets a and b is the set of elements which are in a, or b, or in both a and b.

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

When you run the above program, the output will be:

 (8, 2, 9, 4, 5, 7, 6, 3, 1, 0)

2. Intersection

The intersection of two sets a and b is the set that contains all elements of a that also belong to b.

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

When you run the above program, the output will be:

 (7, 3)

Therefore, print(a.intersection(b)) outputs a new set with values (7, 3) that are common in both a and b.

3. Subtracting

The subtraction of two sets a and b is the set that contains all elements of a but removing the elements that also belong to b.

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

When you run the above program, the output will be:

 (5, 9, 1)

Therefore, print(a.subtracting(b)) outputs a new set with values (5, 9, 1).

4. Symmetric Difference

The symmetric difference of two sets a and b is the set that contains all elements which are in either of the sets but not in both of them.

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

When you run the above program, the output will be:

 (5, 6, 8, 0, 1, 9)

Therefore, print(a.symmetricDifference(b)) outputs a new set with values (5, 6, 8, 0, 1, 9).

Set Membership and Equality Operations

Set Equality

You can use == operator to check whether two sets contains same elements or not. It returns true if two sets contains same elements otherwise returns false.

Example 5: Set equality operations

 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 and b are same") ) else ( print("a and b are different") ) if a == c ( print("a and c are same") ) else ( print("a and c are different") ) 

When you run the above program, the output will be:

 a and b are different a and c are same

Set membership

You can also check relationship between two sets using the following methods:

  • isSubset(of:)This method determines whether all of the values of a set are contained in the specified set.
  • isSuperset(of:) This method determines whether a set contains all of the values in a specified set
  • isStrictSubset(of:) or isStrictSuperset(of:): This method determines whether a set is a subset or superset, but not equal to, a specified set.
  • isDisjoint(with:) This method determines whether two sets have no values in common.

Example 6: Set membership operations

 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)) 

When you run the above program,the output will be:

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

Let's analyze methods used inside the print statement below:

  • isSubsetreturns true because the set b contains all the elements in a
  • isSupersetreturn true because b contains all of the values of a.
  • isStrictSubsetreturns true because set b contains all the element in a and both sets are not equal.
  • isDisjointWithreturns false because a and b have some values in common.

Some helpful built in Set functions & properties

1. isEmpty

This property determines if a set is empty or not. It returns true if a set does not contain any value otherwise returns false.

Example 7: How isEmpty works?

 let intSet:Set = (21, 34, 54, 12) print(intSet.isEmpty) 

When you run the program, the output will be:

 false

2. first

This property is used to access first element of a set.

Example 8: How first works?

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

When you run the program, the output will be:

 Optional(54)

Since set is an unordered collection, the first property does not guarantee the first element of the set. You may get other value than 54.

Similarly, you can use last property to access last element of a set.

3. insert

The insert function is used to insert/append element in the set.

Example 9: How insert works?

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

When you run the program, the output will be:

 (54, 12, 50, 21, 34)

4. reversed

This function returns the elements of a set in reverse order.

Example 10: How reversed() works?

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

When you run the program, the output will be:

 (22, 23, 21, 24, 25) (25, 24, 21, 23, 22) 

5. count

This property returns the total number of elements in a set.

Example 11: How count works?

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

When you run the program, the output will be:

 4

6. removeFirst

This function removes and returns the first value from the set.

Example 12: How removeFirst works?

 var strSet:Set = ("ab", "bc", "cd", "de") let removedVal = strSet.removeFirst() print("removed value is (removedVal)") print(strSet) 

When you run the program, the output will be:

 removed value is de ("ab", "cd", "bc") 

Del mismo modo, también puede utilizar la removeAllfunción para vaciar un conjunto.

Articulos interesantes...