V tomto kurzu se dozvíte o sadách, vytváření sad, jejich úpravách a některých běžných operacích v sadách.
V předchozím článku Swift Arrays jsme se dozvěděli o vytvoření pole, které může obsahovat více hodnot v uspořádaném seznamu.
Pokud se ale musíme ujistit, že seznam může obsahovat hodnotu pouze jednou, použijeme sadu v Swiftu.
Co je to sada?
Sady je jednoduše kontejner, který může obsahovat více hodnot datového typu v neuspořádaném seznamu a zajišťuje jedinečný prvek v kontejneru (tj. Každá data se zobrazí pouze jednou).
Neuspořádaný seznam znamená, že nedostanete prvky ve stejném pořadí, v jakém jste definovali položky v sadě.
Hlavní výhodou používání sad přes pole je, když potřebujete zajistit, aby se položka objevila pouze jednou, a když není důležité pořadí položek.
Hodnoty uložené v sadě musí být hashovatelné . To znamená, že musí poskytnout vlastnost hashValue. To je důležité, protože sady jsou neuspořádané a používá hashValue se používá pro přístup k prvkům sad.
Všechny základní typy Swifta (například String
, Int
, Double
a Bool
) jsou hashable ve výchozím nastavení a lze ji použít jako typy nastavených hodnot. Můžete však také vytvořit svůj Hashable Type v Swiftu, který lze uložit v sadě.
Jak deklarovat sadu v Swift?
Prázdnou sadu můžete vytvořit zadáním typu jako Set následovaného typem dat, do kterých může ukládat.
Příklad 1: Deklarace prázdné sady
let emptyIntSet:Set = () print(emptyIntSet)
NEBO
let emptyIntSet:Set = Set() print(emptyIntSet)
Když spustíte program, výstup bude:
()
Ve výše uvedeném programu jsme deklarovali konstantní emptyIntSet typu, Set
který může ukládat více hodnot celého čísla a inicializovat s 0 hodnotami.
Vzhledem k tomu, že Swift je jazyk pro odvození typu, můžete také vytvořit sadu přímo bez zadání datového typu, ale musíte ji inicializovat pomocí některých hodnot, aby kompilátor mohl odvodit svůj typ jako:
Příklad 2: Deklarování množiny s některými hodnotami
let someIntSet:Set = (1, 2, 3, 4, 5, 6, 7, 8, 9) print(someIntSet)
Když spustíte program, výstup bude:
(2, 4, 9, 5, 6, 7, 3, 1, 8)
Ve výše uvedeném programu jsme deklarovali konstantu someIntSet, která může ukládat sady Integer bez výslovného zadání typu. :Set
Při definování proměnné však musíme psát , jinak pro nás Swift vytvoří pole.
Jako pole jsme také inicializovali sadu s hodnotami 1, 2, 3, 4, 5, 6, 7, 8, 9 pomocí ()
závorek.
Jak jste se dozvěděli, při pokusu o tisk hodnot uvnitř sady jako print(someIntSet)
získáte výsledky v jiném pořadí, než jste definovali položky v sadě, protože ukládá hodnotu bez definovaného řazení. Proto se pokaždé, když vstoupíte do objednávky, změní.
Příklad 3: Deklarování sady s duplicitními hodnotami
let someStrSet:Set = ("ab","bc","cd","de","ab") print(someStrSet)
Když spustíte program, výstup bude:
(„de“, „ab“, „cd“, „bc“)
Ve výše uvedeném programu jsme v sadě definovali duplicitní hodnotu ab . A. když se pokusíme získat přístup k hodnotě uvnitř sady pomocí print(someStrSet)
, duplicitní hodnota je ze sady automaticky odstraněna. Sada proto zaručuje jedinečné prvky / hodnoty uvnitř.
V aplikaci Swift můžete také deklarovat sadu s vlastním vlastním typem Hashable. Další informace najdete na stránce Swift Hashable.
Jak získat přístup k prvkům sady v Swiftu?
Nemůžete přistupovat k prvkům sady pomocí syntaxe dolního indexu jako polí. Důvodem je, že sady jsou neuspořádané a nemají indexy pro přístup k prvkům.
Musíte tedy přistupovat k sadě pomocí jejích metod a vlastností nebo pomocí smyček pro vstup.
Příklad 4: Přístup k prvkům sady
var someStrSet:Set = ("ab", "bc", "cd", "de") for val in someStrSet ( print(val) )
Když spustíte program, výstup bude:
de ab cd bc
Ve výše uvedeném programu dostaneme val v jiném pořadí než prvky sady, protože sady jsou na rozdíl od polí neuspořádané.
Můžete také přistupovat k prvku sady přímo odebráním hodnoty ze sady, jak je uvedeno níže:
Příklad 5: Přístup k prvkům sady pomocí remove ()
var someStrSet:Set = ("ab", "bc", "cd", "de") let someVal = someStrSet.remove("cd") print(someVal) print(someStrSet)
Když spustíte program, výstup bude:
Volitelné ("cd") ("de", "ab", "bc")
Ve výše uvedeném programu můžete vidět, že metoda remove vrací volitelný řetězec. Proto se doporučuje provést volitelnou manipulaci, jak je uvedeno níže. Další informace o volitelných doplňcích najdete na stránce Swift Optionals.
Příklad 6: Volitelné zpracování pro 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") )
Když spustíte program, výstup bude:
cd ("de", "ab", "bc")
Jak přidat nový prvek do sady?
Můžete přidat nový prvek do sady pomocí insert()
metody v Swift.
Příklad 7: Přidat nový prvek pomocí insert ()
var someStrSet:Set = ("ab", "bc", "cd", "de") someStrSet.insert("ef") print(someStrSet)
Když spustíte program, výstup bude:
("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 setisStrictSubset(of:
) orisStrictSuperset(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:
isSubset
returnstrue
because the set b contains all the elements in aisSuperset
returntrue
because b contains all of the values of a.isStrictSubset
returnstrue
because set b contains all the element in a and both sets are not equal.isDisjointWith
returnsfalse
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")
Podobně můžete také použít removeAll
funkci k vyprázdnění sady.