Swift Sets: comment l'utiliser et pourquoi? (Avec des exemples)

Dans ce didacticiel, vous découvrirez les ensembles, la création d'ensembles, leur modification et certaines opérations courantes dans les ensembles.

Dans l'article précédent de Swift Arrays, nous avons appris à créer un tableau pouvant contenir plusieurs valeurs dans une liste ordonnée.

Mais, si nous devons nous assurer qu'une liste ne peut contenir une valeur qu'une seule fois, nous utilisons un ensemble dans Swift.

Qu'est-ce qu'un ensemble?

Sets est simplement un conteneur qui peut contenir plusieurs valeurs de type de données dans une liste non ordonnée et garantit un élément unique dans le conteneur (c'est-à-dire que chaque donnée n'apparaît qu'une seule fois).

Une liste non ordonnée signifie que vous n'obtiendrez pas les éléments dans le même ordre que vous avez défini les éléments dans l'ensemble.

Le principal avantage de l'utilisation d'ensembles par rapport aux tableaux est lorsque vous devez vous assurer qu'un élément n'apparaît qu'une seule fois et lorsque l'ordre des éléments n'est pas important.

Les valeurs stockées dans un ensemble doivent être hachables . Cela signifie qu'il doit fournir une propriété hashValue. Ceci est important car les ensembles ne sont pas ordonnés et il utilise hashValue est utilisé pour accéder aux éléments des ensembles.

Tous les types de base de Swift (comme String, Int, Doubleet Bool) sont indexables par défaut et peuvent être utilisés comme types de valeurs définies. Cependant, vous pouvez également créer votre type hashable dans Swift qui peut être stocké dans un ensemble.

Comment déclarer un ensemble dans Swift?

Vous pouvez créer un ensemble vide en spécifiant le type comme Ensemble suivi du type de données dans lequel il peut stocker.

Exemple 1: déclarer un ensemble vide

 let emptyIntSet:Set = () print(emptyIntSet) 

OU

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

Lorsque vous exécutez le programme, la sortie sera:

 ()

Dans le programme ci-dessus, nous avons déclaré une constante emptyIntSet de type Setqui peut stocker plusieurs valeurs d'entier et initialisée avec 0 valeurs.

Puisque Swift est un langage d'inférence de type, vous pouvez également créer un ensemble directement sans spécifier le type de données, mais vous devez initialiser avec certaines valeurs afin que le compilateur puisse déduire son type comme:

Exemple 2: déclarer un ensemble avec certaines valeurs

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

Lorsque vous exécutez le programme, la sortie sera:

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

Dans le programme ci-dessus, nous avons déclaré une constante someIntSet qui peut stocker des ensembles d'entiers sans spécifier explicitement le type. Cependant, nous devons écrire :Setlors de la définition de la variable, sinon Swift créera un tableau pour nous.

De plus, en tant que tableaux, nous avons initialisé l'ensemble avec 1, 2, 3, 4, 5, 6, 7, 8, 9 valeurs en utilisant les ()crochets.

Comme vous l'avez appris, lorsque vous essayez d'imprimer les valeurs à l'intérieur de l'ensemble sous forme de print(someIntSet), vous obtiendrez les résultats dans un ordre différent de celui que vous avez défini pour les éléments de l'ensemble car il stocke la valeur sans ordre défini. Par conséquent, chaque fois que vous accédez à la commande change.

Exemple 3: déclaration d'un ensemble avec des valeurs en double

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

Lorsque vous exécutez le programme, la sortie sera:

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

Dans le programme ci-dessus, nous avons défini une valeur en double ab dans l'ensemble. Et. lorsque nous essayons d'accéder à la valeur à l'intérieur de l'ensemble en utilisant print(someStrSet), la valeur en double est automatiquement supprimée de l'ensemble. Par conséquent, set garantit des éléments / valeurs uniques à l'intérieur.

Vous pouvez également déclarer un ensemble avec votre propre type hashable personnalisé dans Swift. Pour en savoir plus, visitez Swift Hashable.

Comment accéder aux éléments de set dans Swift?

Vous ne pouvez pas accéder aux éléments d'un ensemble à l'aide de la syntaxe d'indice sous forme de tableaux. Cela est dû au fait que les ensembles ne sont pas ordonnés et n'ont pas d'index pour accéder aux éléments.

Vous devez donc accéder à l'ensemble en utilisant ses méthodes et propriétés ou en utilisant des boucles d'entrée.

Exemple 4: Accéder aux éléments d'un ensemble

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

Lorsque vous exécutez le programme, la sortie sera:

 de ab cd bc 

Dans le programme ci-dessus, nous obtenons le val dans un ordre différent de celui des éléments d'un ensemble car les ensembles ne sont pas ordonnés contrairement aux tableaux.

Vous pouvez également accéder à l'élément d'un ensemble en supprimant directement la valeur de l'ensemble comme ci-dessous:

Exemple 5: Accéder aux éléments d'un ensemble à l'aide de remove ()

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

Lorsque vous exécutez le programme, la sortie sera:

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

Dans le programme ci-dessus, vous pouvez voir que la méthode remove renvoie une chaîne facultative. Par conséquent, il est recommandé d'effectuer la gestion facultative comme ci-dessous. Pour en savoir plus sur les options, visitez Swift Optionals.

Exemple 6: Gestion facultative de 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") ) 

Lorsque vous exécutez le programme, la sortie sera:

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

Comment ajouter un nouvel élément dans un ensemble?

Vous pouvez ajouter un nouvel élément à un ensemble en utilisant la insert()méthode dans Swift.

Exemple 7: Ajouter un nouvel élément en utilisant insert ()

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

Lorsque vous exécutez le programme, la sortie sera:

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

De même, vous pouvez également utiliser la removeAllfonction pour vider un ensemble.

Articles intéressants...