Conjuntos Swift: como usar e por quê? (Com exemplos)

Neste tutorial, você aprenderá sobre conjuntos, criação de conjuntos, modificação deles e algumas operações comuns em conjuntos.

No artigo anterior do Swift Arrays, aprendemos como criar um array que pode conter vários valores em uma lista ordenada.

Mas, se tivermos que ter certeza de que uma lista pode conter um valor apenas uma vez, usamos um conjunto em Swift.

O que é um conjunto?

Sets é simplesmente um contêiner que pode conter vários valores de tipo de dados em uma lista não ordenada e garante um elemento único no contêiner (ou seja, cada dado aparece apenas uma vez).

Lista não ordenada significa que você não obterá os elementos na mesma ordem em que definiu os itens no Conjunto.

A principal vantagem de usar Sets em vez de arrays é quando você precisa garantir que um item apareça apenas uma vez e quando a ordem dos itens não for importante.

Os valores armazenados em um conjunto devem ser hashable . Isso significa que ele deve fornecer uma propriedade hashValue. Isso é importante porque os conjuntos não são ordenados e usa hashValue para acessar os elementos dos conjuntos.

Todos tipos básicos de Swift (como tal String, Int, Double, e Bool) são Hashable por padrão, e pode ser usado como tipos de valor definido. No entanto, você também pode criar seu Hashable Type no Swift que pode ser armazenado em um conjunto.

Como declarar um conjunto em Swift?

Você pode criar um conjunto vazio especificando o tipo como Conjunto seguido pelo tipo de dados que ele pode armazenar.

Exemplo 1: Declarando um conjunto vazio

 let emptyIntSet:Set = () print(emptyIntSet) 

OU

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

Quando você executa o programa, a saída será:

 ()

No programa acima, declaramos uma constante emptyIntSet do tipo Setque pode armazenar vários valores de inteiro e inicializada com 0 valores.

Como Swift é uma linguagem de inferência de tipo, você também pode criar um conjunto diretamente sem especificar o tipo de dados, mas deve inicializar com alguns valores para que o compilador possa inferir seu tipo como:

Exemplo 2: Declarando um conjunto com alguns valores

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

Quando você executa o programa, a saída será:

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

No programa acima, declaramos uma constante someIntSet que pode armazenar conjuntos de Integer sem especificar o tipo explicitamente. No entanto, precisamos escrever :Setao definir a variável, caso contrário, o Swift criará um array para nós.

Além disso, como matrizes, inicializamos o conjunto com 1, 2, 3, 4, 5, 6, 7, 8, 9 valores usando os ()colchetes.

Como você aprendeu, ao tentar imprimir os valores dentro do conjunto como print(someIntSet), você obterá os resultados em uma ordem diferente daquela definida para os itens no conjunto, porque ele armazena o valor sem uma ordem definida. Portanto, cada vez que você acessar o pedido muda.

Exemplo 3: Declarando um conjunto com valores duplicados

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

Quando você executa o programa, a saída será:

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

No programa acima, definimos um valor duplicado ab no conjunto. E. quando tentamos acessar o valor dentro do conjunto usando print(someStrSet), o valor duplicado é automaticamente removido do conjunto. Portanto, set garante elementos / valores únicos dentro dele.

Você também pode declarar um conjunto com seu próprio tipo Hashable personalizado no Swift. Para saber mais, visite Swift Hashable.

Como acessar os elementos definidos no Swift?

Você não pode acessar os elementos de um conjunto usando a sintaxe de subscrito como matrizes. Isso ocorre porque os conjuntos são desordenados e não possuem índices para acessar os elementos.

Portanto, você precisa acessar o conjunto usando seus métodos e propriedades ou usando loops for-in.

Exemplo 4: Acessando elementos de um conjunto

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

Quando você executa o programa, a saída será:

 de ab cd bc 

No programa acima, obtemos o val em ordem diferente dos elementos de um conjunto porque os conjuntos não são ordenados, ao contrário dos arrays.

Você também pode acessar o elemento de um conjunto removendo diretamente o valor do conjunto conforme abaixo:

Exemplo 5: Acessando elementos de um conjunto usando remove ()

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

Quando você executa o programa, a saída será:

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

No programa acima, você pode ver que o método remove retorna uma string opcional. Portanto, é recomendável que você faça o manuseio opcional conforme abaixo. Para saber mais sobre opcionais, visite Swift Opcionais.

Exemplo 6: manuseio 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") ) 

Quando você executa o programa, a saída será:

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

Como adicionar novo elemento em um conjunto?

Você pode adicionar um novo elemento a um conjunto usando o insert()método em Swift.

Exemplo 7: Adicionar novo elemento usando insert ()

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

Quando você executa o programa, a saída será:

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

No programa acima, usamos o insert()método do conjunto para adicionar um novo elemento a um conjunto. Como os conjuntos não estão ordenados, a posição do elemento inserido não é conhecida.

Operações de conjunto

Outra vantagem principal de usar Conjuntos é que você pode realizar operações de conjunto, como combinar dois conjuntos, determinar quais valores dois conjuntos têm em comum, etc. Essas operações são semelhantes à operação Set em Matemática.

1. União

A união de dois conjuntos aeb é o conjunto de elementos que estão em a, ou b, ou em a e b.

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

Quando você executa o programa acima, a saída será:

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

2. Cruzamento

A interseção de dois conjuntos aeb é o conjunto que contém todos os elementos de a que também pertencem a b.

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

Quando você executa o programa acima, a saída será:

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

Da mesma forma, você também pode usar a removeAllfunção para esvaziar um conjunto.

Artigos interessantes...