Набори Swift: як ним користуватися і чому? (З прикладами)

У цьому підручнику ви дізнаєтесь про набори, створення наборів, їх модифікацію та деякі загальні операції в наборах.

У попередній статті Swift Arrays ми дізналися про створення масиву, який може містити кілька значень у впорядкованому списку.

Але, якщо нам потрібно переконатися, що список може містити значення лише один раз, ми використовуємо набір у Swift.

Що таке набір?

Набори - це просто контейнер, який може містити кілька значень типу даних у невпорядкованому списку та забезпечує унікальний елемент у контейнері (тобто кожна інформація відображається лише один раз).

Невпорядкований список означає, що ви не отримаєте елементи в тому самому порядку, як ви визначили елементи в наборі.

Основна перевага використання наборів над масивами полягає в тому, що вам потрібно переконатися, що елемент відображається лише один раз і коли порядок елементів не важливий.

Значення, що зберігаються в наборі, мають бути хешируемыми . Це означає, що він повинен надати властивість hashValue. Це важливо, оскільки набори не впорядковані, і він використовує hashValue, який використовується для доступу до елементів наборів.

Все основних типів Свіфта (наприклад String, Int, Double, і Bool) є hashable за замовчуванням, і може бути використаний в якості набору типів значень. Тим не менш, ви також можете створити свій Hashable Type в 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), повторюване значення автоматично видаляється з набору. Тому набір гарантує унікальні елементи / значення всередині нього.

Ви також можете оголосити набір із власним типом Hashable у Swift. Щоб дізнатись більше, відвідайте Swift Hashable.

Як отримати доступ до елементів набору в Swift?

Ви не можете отримати доступ до елементів набору, використовуючи синтаксис індексу як масиви. Це тому, що набори не впорядковані і не мають індексів для доступу до елементів.

Отже, вам потрібно отримати доступ до набору, використовуючи його методи та властивості або використовуючи вхідні цикли.

Приклад 4: Доступ до елементів набору

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

Коли ви запускаєте програму, результат буде:

 de ab cd до н.е. 

У наведеній вище програмі ми отримуємо val в іншому порядку, ніж елементи набору, оскільки набори не упорядковані на відміну від масивів.

Ви також можете отримати доступ до елемента набору, безпосередньо видаливши значення з набору, як показано нижче:

Приклад 5: Доступ до елементів набору за допомогою remove ()

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

Коли ви запускаєте програму, результат буде:

 Необов’язково ("cd") ("de", "ab", "bc") 

У наведеній вище програмі ви бачите, що метод remove повертає необов’язковий рядок. Тому рекомендується робити додаткові дії, як показано нижче. Щоб дізнатись більше про опціони, відвідайте Swift Optionals.

Приклад 6: Необов’язкова обробка для видалення ()

 var someStrSet:Set = ("ab", "bc", "cd", "de") if let someVal = someStrSet.remove("cd") ( print(someVal) print(someStrSet) ) else ( print("cannot find element to remove") ) 

Коли ви запускаєте програму, результат буде:

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

Як додати новий елемент у набір?

Ви можете додати новий елемент до набору, використовуючи insert()метод у Swift.

Приклад 7: Додайте новий елемент за допомогою insert ()

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

Коли ви запускаєте програму, результат буде:

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

Так само ви можете використовувати removeAllфункцію для спорожнення набору.

Цікаві статті...