Bộ Swift: Cách sử dụng và tại sao? (Có ví dụ)

Trong hướng dẫn này, bạn sẽ tìm hiểu về tập hợp, tạo tập hợp, sửa đổi chúng và một số thao tác phổ biến trong tập hợp.

Trong bài viết mảng Swift trước, chúng ta đã tìm hiểu về cách tạo mảng có thể chứa nhiều giá trị trong một danh sách có thứ tự.

Tuy nhiên, nếu chúng ta phải đảm bảo rằng một danh sách có thể chứa một giá trị duy nhất một lần, chúng ta sử dụng một bộ trong Swift.

Tập hợp là gì?

Bộ chỉ đơn giản là một vùng chứa có thể chứa nhiều giá trị của kiểu dữ liệu trong một danh sách không có thứ tự và đảm bảo phần tử duy nhất trong vùng chứa (tức là mỗi dữ liệu chỉ xuất hiện một lần).

Danh sách không có thứ tự có nghĩa là bạn sẽ không nhận được các phần tử theo thứ tự giống như bạn đã xác định các mục trong Tập hợp.

Ưu điểm chính của việc sử dụng Bộ trên mảng là khi bạn cần đảm bảo rằng một mục chỉ xuất hiện một lần và khi thứ tự của các mục không quan trọng.

Các giá trị được lưu trữ trong một tập hợp phải có thể băm . Điều này có nghĩa là nó phải cung cấp một thuộc tính hashValue. Điều này quan trọng vì các tập hợp không có thứ tự và nó sử dụng hashValue được sử dụng để truy cập các phần tử của tập hợp.

Tất cả các loại hình cơ bản của Swift (ví dụ như String, Int, Double, và Bool) là hashable theo mặc định, và có thể được sử dụng như các loại giá trị thiết lập. Tuy nhiên, bạn cũng có thể tạo Hashable Type bằng Swift có thể được lưu trữ trong một bộ.

Làm thế nào để khai báo một tập hợp trong Swift?

Bạn có thể tạo một tập hợp trống bằng cách chỉ định loại là Tập, sau đó là loại Dữ liệu mà tập đó có thể lưu trữ bên trong.

Ví dụ 1: Khai báo một tập hợp rỗng

 let emptyIntSet:Set = () print(emptyIntSet) 

HOẶC LÀ

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

Khi bạn chạy chương trình, đầu ra sẽ là:

 ()

Trong chương trình trên, chúng ta đã khai báo một hằng voidIntSet kiểu Setcó thể lưu trữ nhiều giá trị nguyên và được khởi tạo bằng 0 giá trị.

Vì Swift là ngôn ngữ suy luận kiểu, bạn cũng có thể tạo bộ trực tiếp mà không cần chỉ định Kiểu dữ liệu nhưng phải khởi tạo với một số giá trị để trình biên dịch có thể suy ra kiểu của nó là:

Ví dụ 2: Khai báo một tập hợp với một số giá trị

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

Khi bạn chạy chương trình, đầu ra sẽ là:

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

Trong chương trình trên, chúng ta đã khai báo một hằng someIntSet có thể lưu trữ các bộ Số nguyên mà không cần chỉ định kiểu một cách rõ ràng. Tuy nhiên, chúng ta cần viết :Setkhi định nghĩa biến, nếu không Swift sẽ tạo một mảng cho chúng ta.

Ngoài ra, dưới dạng mảng, chúng tôi đã khởi tạo tập hợp với các giá trị 1, 2, 3, 4, 5, 6, 7, 8, 9 bằng cách sử dụng ()dấu ngoặc.

Như bạn đã học, khi bạn cố gắng in các giá trị bên trong tập hợp print(someIntSet), bạn sẽ nhận được kết quả theo một thứ tự khác với bạn đã xác định các mục trong tập hợp vì nó lưu trữ giá trị mà không có thứ tự xác định. Do đó, mỗi khi bạn truy cập đơn hàng sẽ thay đổi.

Ví dụ 3: Khai báo một tập hợp với các giá trị trùng lặp

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

Khi bạn chạy chương trình, đầu ra sẽ là:

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

Trong chương trình trên, chúng ta đã xác định một giá trị trùng lặp ab trong tập hợp. Và. khi chúng tôi cố gắng truy cập giá trị bên trong tập hợp bằng cách sử dụng print(someStrSet), giá trị trùng lặp sẽ tự động bị xóa khỏi tập hợp. Do đó, set đảm bảo các phần tử / giá trị duy nhất bên trong nó.

Bạn cũng có thể khai báo một tập hợp với kiểu Hashable tùy chỉnh của riêng bạn trong Swift. Để tìm hiểu thêm, hãy truy cập Swift Hashable.

Làm thế nào để truy cập các phần tử tập hợp trong Swift?

Bạn không thể truy cập các phần tử của một tập hợp bằng cách sử dụng cú pháp chỉ số con dưới dạng mảng. Điều này là do các tập hợp không có thứ tự và không có chỉ số để truy cập các phần tử.

Vì vậy, bạn cần truy cập tập hợp bằng các phương thức và thuộc tính của nó hoặc sử dụng vòng lặp for-in.

Ví dụ 4: Truy cập các phần tử của một tập hợp

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

Khi bạn chạy chương trình, đầu ra sẽ là:

 de ab cd bc 

Trong chương trình trên, chúng ta nhận được val theo thứ tự khác với các phần tử của một tập hợp bởi vì các tập hợp không có thứ tự không giống như mảng.

Bạn cũng có thể truy cập phần tử của một tập hợp trực tiếp xóa giá trị khỏi tập hợp như sau:

Ví dụ 5: Truy cập các phần tử của một tập hợp bằng remove ()

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

Khi bạn chạy chương trình, đầu ra sẽ là:

 Tùy chọn ("cd") ("de", "ab", "bc") 

Trong chương trình trên, bạn có thể thấy phương thức remove trả về một chuỗi tùy chọn. Do đó, bạn nên thực hiện xử lý tùy chọn như bên dưới. Để tìm hiểu thêm về các tùy chọn, hãy truy cập Tùy chọn Swift.

Ví dụ 6: Xử lý tùy chọn cho 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") ) 

Khi bạn chạy chương trình, đầu ra sẽ là:

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

Làm thế nào để thêm phần tử mới trong một tập hợp?

Bạn có thể thêm một phần tử mới vào một tập hợp bằng insert()phương thức trong Swift.

Ví dụ 7: Thêm phần tử mới bằng insert ()

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

Khi bạn chạy chương trình, đầu ra sẽ là:

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

Tương tự, bạn cũng có thể sử dụng removeAllhàm để làm trống một tập hợp.

thú vị bài viết...