English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 집합, 집합 생성, 집합 수정 및 집합의 일반적인 작업을 배웁니다.
이전 기사에서Swift 배열이 기사에서는 순서 목록에 여러 값을 포함할 수 있는 배열을 생성하는 방법을 배웠습니다.
하지만, 목록이 유일한 값만을 보장하려면 Swift의 set(집합)을 사용합니다.
집합은 단순한 컨테이너로, 비정렬 목록에 여러 데이터 유형의 값을 저장하고, 컨테이너 내 요소가 유일하게 보장됩니다(즉, 각 데이터는 한 번만 등장합니다).
비정렬 목록이므로, 집합에서 항목의 정의 순서에 따라 요소를 얻을 수 없습니다.
집합을 배열 대신 사용하는 주요 장점은, 한个项目이 한 번만 등장하도록 보장하고, 순서가 중요하지 않을 때입니다.
셋에 저장된 값은 해시되어야 합니다. 이는 hashValue 속성을 제공해야 하며, 이는 셋이 비순서적이기 때문에 요소에 접근할 때 사용됩니다.
Swift의 모든 기본 타입(예: String, Int, Double, Bool)은 기본적으로 해시 가능하며, 셋의 값으로 사용될 수 있습니다. 그러나 Swift에서는 셋에 저장할 수 있는 해시 타입을 생성할 수도 있습니다.
타입을 지정하고 <>안에 저장할 수 있는 데이터 타입을 지정하면 빈 셋을 생성할 수 있습니다.
let emptyIntSet:Set = [] print(emptyIntSet)
또는
let emptyIntSet:Set = Set() print(emptyIntSet)
프로그램을 실행할 때, 출력은 다음과 같습니다:
[ ]
위의 프로그램에서 우리는 emptyInt라는 Set 타입 상수를 선언했습니다. 이 상수는 여러 정수 값을 저장할 수 있으며 0 값을 초기화합니다.
Swift는 타입 추론 언어이므로, set 셋을 생성할 때 타입을 지정하지 않고도 직접 생성할 수 있습니다. 그러나 컴파일러가 타입을 추론할 수 있도록 초기화 값을 사용해야 합니다:
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)으로 출력하려고 할 때, 다른 순서를 얻게 됩니다. 이는 셋에서 정의한 항목 순서와 다릅니다. 왜냐하면 셋은 값의 순서를 정의하지 않기 때문입니다. 따라서 매번 접근할 때마다 순서가 달라집니다.
let someStrSet:Set = ["ab","bc","cd","de","ab"] print(someStrSet)
프로그램을 실행할 때, 출력은 다음과 같습니다:
["de", "ab", "cd", "bc"]
당신은 이미 알고 있듯이, 셋 내의 값을 출력(someIntSet)으로 시도할 때, 위의 프로그램에서 우리는 셋에 중복 값을 정의한 ab를 추가했습니다. 또한, 우리가 print(someStrSet)을 사용하여 셋 내의 값을 접근하려고 할 때, 중복 값은 자동으로 셋에서 제거됩니다. 따라서 set은 유일한 요소를 보장합니다/값
Swift에서는 직접 정의한 Hashable 타입을 사용하여 집합을 선언할 수도 있습니다.
인덱스语法를 사용하여 배열과 같이 집합의 요소를 접근할 수 없습니다. 이는 집합이 순서가 없고 요소의 인덱스가 없기 때문입니다.
따라서, 메서드와 속성을 사용하거나 for 루프를 사용하여 접근해야 합니다.-인라인 루프를 사용하여 집합을 접근합니다.
var someStrSet:Set = ["ab", "bc", "cd", "de"] for val in someStrSet { print(val) }
프로그램을 실행할 때, 출력은 다음과 같습니다:
de ab cd bc
위 프로그램에서는 val과 집합의 요소의 순서가 다른 것을 볼 수 있습니다. 이는 집합이 배열과 달리 순서가 없기 때문입니다.
집합의 요소에 접근할 수도 있습니다. 예를 들어, 다음과 같이 값을 직접 집합에서 제거할 수 있습니다:
var someStrSet:Set = ["ab", "bc", "cd", "de"] let someVal = someStrSet.remove("cd") print(someVal) print(someStrSet)
프로그램을 실행할 때, 출력은 다음과 같습니다:
Optional("cd") ["de", "ab", "bc"]
위 프로그램에서는 remove 메서드가 선택 가능한 문자열을 반환한다는 것을 볼 수 있습니다. 따라서 다음 선택적 처리를 수행하는 것이 좋습니다. 선택적에 대해 더 알고 싶다면, 다음 사이트를 방문하세요Swift 선택。
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"]
Swift에서 insert() 메서드를 사용하여 집합에 새로운 요소를 추가할 수 있습니다.
var someStrSet:Set = ["ab", "bc", "cd", "de"] someStrSet.insert("ef") print(someStrSet)
프로그램을 실행할 때, 출력은 다음과 같습니다:
["ab", "de", "cd", "ef", "bc"]
위 프로그램에서는 집합의 insert() 메서드를 사용하여 집합에 새로운 요소를 추가합니다. 집합이 순서가 없기 때문에 요소가 추가될 위치는 알 수 없습니다.
집합의 또 다른 주요 장점은 집합 연산을 수행할 수 있다는 점입니다. 예를 들어, 두 집합을 합쳐서 결합하거나 두 집합이 공통된 값이 있는지 결정하는 등의 연산이 있습니다. 이러한 연산은 수학에서의 집합 연산과 유사합니다.
두 집합 a와 b의 합집합은 a나 b에 있거나 또는 a와 b의 두 집합에 모두 있는 요소를 포함하는 집합입니다.
let a: Set = [1, 3, 5, 7, 9] let b: Set = [0, 2, 4, 6, 8] print(a.union(b))
当您运行上述程序时,输出将是:
[8, 2, 9, 4, 5, 7, 6, 3, 1, 0]
두 집합 a와 b의 교집합은 a의 모든 요소를 포함하며 동시에 b에도 포함된 요소를 포함하는 집합입니다.
let a: Set = [1, 3, 5, 7, 9] let b: Set = [0, 3, 7, 6, 8] print(a.intersection(b))
当您运行上述程序时,输出将是:
[7, 3]
따라서,print(a.intersection(b))는 다음 값을 출력하는 새로운 집합을 생성합니다 [7、3] a와 b 집합에서 모두 존재합니다.
두 집합 a와 b의 차집합은 a의 모든 요소를 포함하지만 b에도 포함된 요소를 제거한 집합입니다.
let a: Set = [1, 3, 5, 7, 9] let b: Set = [0, 3, 7, 6, 8] print(a.subtracting(b))
当您运行上述程序时,输出将是:
[5, 9, 1]
따라서,print(a.subtracting(b))는 다음 값을 출력합니다[ 5,9,1]의 새로운 집합.
두 집합 a와 b의 대칭 차집합은 두 집합의任何一个에 위치하는 모든 요소를 포함하는 집합입니다. 이 요소들은 두 집합의任何一个에 위치하지만 동시에 두 집합에 위치하지 않습니다.
let a: Set = [1, 3, 5, 7, 9] let b: Set = [0, 3, 7, 6, 8] print(a.symmetricDifference(b))
当您运行上述程序时,输出将是:
[5, 6, 8, 0, 1, 9]
따라서,print(a.symmetricDifference(b))는 다음 값을 출력합니다[ 5、6、8、0、1、9]의 새로운 집합.
== 연산자를 사용하여 두 집합이 동일한 요소를 포함하고 있는지 확인할 수 있습니다. 두 집합이 동일한 요소를 포함하고 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
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와 b가 같습니다") } else { print("a와 b가 다릅니다") } if a == c { print("a와 c가 같습니다") } else { print("a와 c가 다릅니다") }
当您运行上述程序时,输出将是:
a와 b가 다릅니다 a와 c가 같습니다
두 집합의 관계를 확인할 수 있는 다른 메서드를 사용할 수도 있습니다:
isSubset(of:) - 이 메서드는 하나의 집합의 모든 값이 지정된 집합에 존재하는지 확인합니다.
isSuperset(of:) - 이 메서드는 집합이 지정된 집합의 모든 값을 포함하고 있는지 확인합니다.
isStrictSubset(of:) 또는 isStrictSuperset(of:): - 이 메서드는 하나의 집합이 지정된 집합의 부집합이거나 과집합인지 확인합니다. 그러나 지정된 집합과는 동일하지 않습니다.
isDisjoint(with:) - 이 메서드는 두 집합이 공통된 값이 있는지 확인합니다.
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))
当您运行上述程序时,输出将是:
isSubset: true isSuperset: true isStrictSubset: true isDisjointWith: false
让我们分析下面的print语句中使用的方法:
isSubset返回 true,因为集合b包含a中的所有元素
isSuperset返回true,因为b包含a的所有值。
isStrictSubset返回true,因为集合b包含a中的所有元素,并且两个集合不相等。
isDisjointWithreturns 返回 false,因为a和b具有一些共同的值。
此属性确定集合是否为空。如果集合不包含任何值,它返回true,否则返回false。
let intSet = [21, 34, 54, 12] print(intSet.isEmpty)
프로그램을 실행할 때, 출력은 다음과 같습니다:
false
此属性用于访问集合的第一个元素。
let intSet = [21, 34, 54, 12] print(intSet.first)
프로그램을 실행할 때, 출력은 다음과 같습니다:
Optional(54)
由于Set是无序集合,因此 first 属性并不能保证是该集合的第一个元素。 您很有可能会得到54以外的其他值。
同样,您可以使用 last 属性来访问集合的最后一个元素。
insert函数用于在集合中插入/追加元素。
var intSet:Set = [21, 34, 54, 12] intSet.insert(50) print(intSet)
프로그램을 실행할 때, 출력은 다음과 같습니다:
[54, 12, 50, 21, 34]
此函数以相反的顺序返回集合的元素。
var intSet:Set = [21, 22, 23, 24, 25] print(intSet) let reversedSet = intSet.reversed() print(reversedSet)
프로그램을 실행할 때, 출력은 다음과 같습니다:
[22, 23, 21, 24, 25] [25, 24, 21, 23, 22]
이 속성은 집합에 있는 요소의 총 수를 반환합니다.
let floatSet:Set = [10.2, 21.3, 32.0, 41.3] print(floatSet.count)
프로그램을 실행할 때, 출력은 다음과 같습니다:
4
이 함수는 집합에서 첫 번째 값을 삭제하고 반환합니다.
var strSet:Set = ["ab", "bc", "cd", "de"] let removedVal = strSet.removeFirst() print("removed value is \(removedVal)") print(strSet)
프로그램을 실행할 때, 출력은 다음과 같습니다:
removed value is de ["ab", "cd", "bc"]
또한, removeAll 함수를 사용하여 집합을 비우실 수 있습니다.