Swift Sets: Πώς να το χρησιμοποιήσετε και γιατί; (Με παραδείγματα)

Σε αυτό το σεμινάριο, θα μάθετε για τα σύνολα, τη δημιουργία συνόλων, την τροποποίησή τους και ορισμένες κοινές λειτουργίες σε σύνολα.

Στο προηγούμενο άρθρο Swift Arrays, μάθαμε για τη δημιουργία πίνακα που μπορεί να διατηρεί πολλές τιμές σε μια λίστα με σειρά.

Όμως, αν πρέπει να βεβαιωθούμε ότι μια λίστα μπορεί να έχει τιμή μόνο μία φορά, χρησιμοποιούμε ένα σετ στο Swift.

Τι είναι ένα σετ;

Τα σύνολα είναι απλά ένα κοντέινερ που μπορεί να διατηρήσει πολλαπλή τιμή τύπου δεδομένων σε μια λίστα χωρίς ταξινόμηση και να διασφαλίσει μοναδικό στοιχείο στο κοντέινερ (δηλαδή κάθε δεδομένα εμφανίζεται μόνο μία φορά)

Μη ταξινομημένη λίστα σημαίνει ότι δεν θα λάβετε τα στοιχεία με την ίδια σειρά όπως ορίσατε τα στοιχεία στο σύνολο.

Το κύριο πλεονέκτημα της χρήσης Sets over array είναι όταν πρέπει να διασφαλίσετε ότι ένα στοιχείο εμφανίζεται μόνο μία φορά και όταν η σειρά των αντικειμένων δεν είναι σημαντική.

Οι τιμές που είναι αποθηκευμένες σε ένα σύνολο πρέπει να είναι κατακερματισμένες . Αυτό σημαίνει ότι πρέπει να παρέχει μια ιδιότητα hashValue. Αυτό είναι σημαντικό επειδή τα σύνολα δεν είναι ταξινομημένα και χρησιμοποιεί το hashValue για πρόσβαση στα στοιχεία των συνόλων.

Όλα τα βασικά είδη Swift (όπως String, Int, Doubleκαι Bool) είναι hashable από προεπιλογή, και μπορεί να χρησιμοποιηθεί ως σύνολο τύπων αξία. Ωστόσο, μπορείτε επίσης να δημιουργήσετε τον τύπο Hashable στο Swift που μπορεί να αποθηκευτεί σε ένα σετ.

Πώς να δηλώσετε ένα σετ στο Swift;

Μπορείτε να δημιουργήσετε ένα κενό σύνολο καθορίζοντας τον τύπο ως Σετ ακολουθούμενο από τον τύπο Δεδομένων στα οποία μπορεί να αποθηκεύσει.

Παράδειγμα 1: Δήλωση ενός κενού συνόλου

 let emptyIntSet:Set = () print(emptyIntSet) 

Ή

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

Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:

 ()

Στο παραπάνω πρόγραμμα, έχουμε δηλώσει ένα σταθερό κενόIntSet τύπου 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 π.Χ. 

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 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λειτουργία για να αδειάσετε ένα σύνολο.

ενδιαφέροντα άρθρα...