В този урок ще научите за набори, създаване на набори, тяхното модифициране и някои често срещани операции в набори.
В предишната статия за Swift Arrays научихме за създаването на масив, който може да съдържа множество стойности в подреден списък.
Но ако трябва да се уверим, че списъкът може да съдържа стойност само веднъж, използваме набор в Swift.
Какво е комплект?
Sets е просто контейнер, който може да съдържа множество стойности на типа данни в неподреден списък и осигурява уникален елемент в контейнера (т.е. всяка информация се появява само веднъж).
Неуреден списък означава, че няма да получите елементите в същия ред, както сте определили елементите в Set.
Основното предимство на използването на набори над масиви е, когато трябва да се уверите, че даден елемент се появява само веднъж и когато редът на елементите не е важен.
Стойностите, съхранявани в набор, трябва да могат да се разширяват . Това означава, че трябва да предостави свойство hashValue. Това е важно, защото наборите са неподредени и използва hashValue, използва се за достъп до елементите на наборите.
Всички основни типа на SWIFT (като String
, Int
, Double
, и Bool
) са hashable по подразбиране и може да се използва като видове зададена стойност. Можете обаче да създадете своя хашабъл тип в Swift, който може да се съхранява в комплект.
Как да декларирам набор в Swift?
Можете да създадете празен набор, като посочите типа като Set, последван от типа данни, които може да съхранява в него.
Пример 1: Деклариране на празен набор
let emptyIntSet:Set = () print(emptyIntSet)
ИЛИ
let emptyIntSet:Set = Set() print(emptyIntSet)
Когато стартирате програмата, изходът ще бъде:
()
В горната програма декларирахме константа от тип emptyIntSet, Set
която може да съхранява множество стойности от цяло число и инициализирана с 0 стойности.
Тъй като Swift е език за извеждане на тип, можете също така да създадете набор директно, без да посочвате типа данни, но трябва да инициализирате с някои стойности, така че компилаторът да може да изведе неговия тип като:
Пример 2: Деклариране на набор с някои стойности
let someIntSet:Set = (1, 2, 3, 4, 5, 6, 7, 8, 9) print(someIntSet)
Когато стартирате програмата, изходът ще бъде:
(2, 4, 9, 5, 6, 7, 3, 1, 8)
В горната програма декларирахме константа someIntSet, която може да съхранява набори от Integer, без да посочва изрично типа. Трябва обаче да пишем, :Set
когато дефинираме променливата, в противен случай Swift ще създаде масив за нас.
Също така като масиви сме инициализирали набора със стойности 1, 2, 3, 4, 5, 6, 7, 8, 9 , използвайки ()
скобите.
Както научихте, когато се опитате да отпечатате стойностите вътре в набора като print(someIntSet)
, ще получите резултатите в различен ред, отколкото сте дефинирали елементите в набора, тъй като той съхранява стойност без определена подреждане. Следователно, всеки път, когато имате достъп до поръчката се променя.
Пример 3: Деклариране на набор с дублиращи се стойности
let someStrSet:Set = ("ab","bc","cd","de","ab") print(someStrSet)
Когато стартирате програмата, изходът ще бъде:
("de", "ab", "cd", "bc")
В горната програма дефинирахме дублирана стойност ab в набора. И. когато се опитваме да осъществим достъп до стойността в набора с помощта print(someStrSet)
, дублиращата се стойност автоматично се премахва от набора. Следователно, set гарантира уникални елементи / стойности вътре в него.
Можете също така да декларирате набор със собствен персонализиран тип Hashable в Swift. За да научите повече, посетете Swift Hashable.
Как да осъществите достъп до зададени елементи в Swift?
Не можете да получите достъп до елементи от набор, като използвате синтаксис на индекс като масиви. Това е така, защото множествата са неподредени и нямат индекси за достъп до елементите.
Така че, трябва да осъществите достъп до набора, използвайки неговите методи и свойства или използвайки входящи цикли.
Пример 4: Достъп до елементи от набор
var someStrSet:Set = ("ab", "bc", "cd", "de") for val in someStrSet ( print(val) )
Когато стартирате програмата, изходът ще бъде:
de ab cd bc
In the above program, we get the val in different order than elements of a set because sets are unordered unlike arrays.
You can also access element of a set directly removing the value from the set as below:
Example 5: Accessing elements of a set using remove()
var someStrSet:Set = ("ab", "bc", "cd", "de") let someVal = someStrSet.remove("cd") print(someVal) print(someStrSet)
When you run the program, the output will be:
Optional("cd") ("de", "ab", "bc")
In the above program, you can see the remove method returns an optional string. Therefore, it's recommended you to do optional handling as below. To learn more about optionals, visit Swift Optionals.
Example 6: Optional handling for 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") )
When you run the program, the output will be:
cd ("de", "ab", "bc")
How to add new element in a set?
You can add a new element to a set using insert()
method in Swift.
Example 7: Add new element using insert()
var someStrSet:Set = ("ab", "bc", "cd", "de") someStrSet.insert("ef") print(someStrSet)
When you run the program, the output will be:
("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")
По същия начин можете да използвате removeAll
функция и за изпразване на набор.