Snabba uppsättningar: Hur man använder den och varför? (Med exempel)

I denna handledning lär du dig om uppsättningar, skapa uppsättningar, ändra dem och några vanliga operationer i uppsättningar.

I den tidigare artikeln om Swift Arrays lärde vi oss att skapa array som kan innehålla flera värden i en ordnad lista.

Men om vi måste se till att en lista bara kan innehålla ett värde en gång, använder vi en uppsättning i Swift.

Vad är en uppsättning?

Uppsättningar är helt enkelt en behållare som kan innehålla flera värden för datatyp i en oordnad lista och säkerställer unikt element i behållaren (dvs. varje data visas bara en gång).

Oordnad lista betyder att du inte får elementen i samma ordning som du definierade objekten i uppsättningen.

Den största fördelen med att använda uppsättningar över matriser är när du behöver se till att ett objekt bara visas en gång och när ordningsföljden inte är viktig.

Värden som lagras i en uppsättning måste vara hashbara . Det betyder att den måste tillhandahålla en hashValue-egenskap. Detta är viktigt eftersom uppsättningar inte är ordnade och det använder hashValue används för att komma åt elementen i uppsättningarna.

Alla Swift grundläggande typer (t.ex. String, Int, Double, och Bool) är hashable som standard, och kan användas som set värdetyper. Du kan dock också skapa din Hashable-typ i Swift som kan lagras i en uppsättning.

Hur man förklarar en uppsättning i Swift?

Du kan skapa en tom uppsättning genom att ange typen som Set följt av vilken typ av data den kan lagras i.

Exempel 1: Deklarera en tom uppsättning

 let emptyIntSet:Set = () print(emptyIntSet) 

ELLER

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

När du kör programmet blir resultatet:

 ()

I ovanstående program har vi deklarerat en konstant tomIntSet av typen Setsom kan lagra flera värden av heltal och initialiseras med 0-värden.

Eftersom Swift är ett typsinferensspråk kan du också skapa en uppsättning direkt utan att specificera datatypen men måste initieras med vissa värden så att kompilatorn kan härleda sin typ som:

Exempel 2: Deklarera en uppsättning med vissa värden

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

När du kör programmet blir resultatet:

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

I ovanstående program har vi deklarerat en konstant someIntSet som kan lagra uppsättningar av heltal utan att specifikt specificera typen. Vi måste dock skriva :Setnär vi definierar variabeln, annars skapar Swift en matris för oss.

Som arrayer har vi också initierat uppsättningen med 1, 2, 3, 4, 5, 6, 7, 8, 9 värden med hjälp av ()parenteserna.

Som du har lärt dig, när du försöker skriva ut värdena i uppsättningen som print(someIntSet), får du resultaten i en annan ordning än du har definierat objekten i uppsättningen eftersom den lagrar värde utan någon definierad ordning. Därför ändras varje gång när du öppnar ordern.

Exempel 3: Deklarera en uppsättning med dubbla värden

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

När du kör programmet blir resultatet:

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

I ovanstående program har vi definierat ett dubblettvärde ab i uppsättningen. Och. när vi försöker komma åt värdet inuti uppsättningen med print(someStrSet), tas duplikatvärdet automatiskt bort från uppsättningen. Därför garanterar set unika element / värden inuti den.

Du kan också deklarera en uppsättning med din egen anpassade Hashable-typ i Swift. För att lära dig mer, besök Swift Hashable.

Hur får jag tillgång till uppsatta element i Swift?

Du kan inte komma åt element i en uppsättning med hjälp av subscript-syntax som matriser. Detta beror på att uppsättningar inte är ordnade och inte har index för att komma åt elementen.

Så du måste komma åt uppsättningen med dess metoder och egenskaper eller med in-loopar.

Exempel 4: Åtkomst till element i en uppsättning

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

När du kör programmet blir resultatet:

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

På samma sätt kan du också använda removeAllfunktionen för att tömma en uppsättning.

Intressanta artiklar...