English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift 집합 (Set)

이 튜토리얼에서는 집합, 집합 생성, 집합 수정 및 집합의 일반적인 작업을 배웁니다.

이전 기사에서Swift 배열이 기사에서는 순서 목록에 여러 값을 포함할 수 있는 배열을 생성하는 방법을 배웠습니다.

하지만, 목록이 유일한 값만을 보장하려면 Swift의 set(집합)을 사용합니다.

집합이 무엇인가요?

집합은 단순한 컨테이너로, 비정렬 목록에 여러 데이터 유형의 값을 저장하고, 컨테이너 내 요소가 유일하게 보장됩니다(즉, 각 데이터는 한 번만 등장합니다).

비정렬 목록이므로, 집합에서 항목의 정의 순서에 따라 요소를 얻을 수 없습니다.

집합을 배열 대신 사용하는 주요 장점은, 한个项目이 한 번만 등장하도록 보장하고, 순서가 중요하지 않을 때입니다.

셋에 저장된 값은 해시되어야 합니다. 이는 hashValue 속성을 제공해야 하며, 이는 셋이 비순서적이기 때문에 요소에 접근할 때 사용됩니다.

Swift의 모든 기본 타입(예: String, Int, Double, Bool)은 기본적으로 해시 가능하며, 셋의 값으로 사용될 수 있습니다. 그러나 Swift에서는 셋에 저장할 수 있는 해시 타입을 생성할 수도 있습니다.

Swift에서 셋을 어떻게 선언할 수 있습니까?

타입을 지정하고 <>안에 저장할 수 있는 데이터 타입을 지정하면 빈 셋을 생성할 수 있습니다.

예제1빈 셋을 선언합니다

let emptyIntSet:Set = []
print(emptyIntSet)

또는

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

프로그램을 실행할 때, 출력은 다음과 같습니다:

[ ]

위의 프로그램에서 우리는 emptyInt라는 Set 타입 상수를 선언했습니다. 이 상수는 여러 정수 값을 저장할 수 있으며 0 값을 초기화합니다.

Swift는 타입 추론 언어이므로, set 셋을 생성할 때 타입을 지정하지 않고도 직접 생성할 수 있습니다. 그러나 컴파일러가 타입을 추론할 수 있도록 초기화 값을 사용해야 합니다:

예제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"]

당신은 이미 알고 있듯이, 셋 내의 값을 출력(someIntSet)으로 시도할 때, 위의 프로그램에서 우리는 셋에 중복 값을 정의한 ab를 추가했습니다. 또한, 우리가 print(someStrSet)을 사용하여 셋 내의 값을 접근하려고 할 때, 중복 값은 자동으로 셋에서 제거됩니다. 따라서 set은 유일한 요소를 보장합니다/값

Swift에서는 직접 정의한 Hashable 타입을 사용하여 집합을 선언할 수도 있습니다.

Swift에서 집합 요소 접근 방법?

인덱스语法를 사용하여 배열과 같이 집합의 요소를 접근할 수 없습니다. 이는 집합이 순서가 없고 요소의 인덱스가 없기 때문입니다.
따라서, 메서드와 속성을 사용하거나 for 루프를 사용하여 접근해야 합니다.-인라인 루프를 사용하여 집합을 접근합니다.

예제4:for...in으로 집합의 요소 접근

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

프로그램을 실행할 때, 출력은 다음과 같습니다:

de
ab
cd
bc

위 프로그램에서는 val과 집합의 요소의 순서가 다른 것을 볼 수 있습니다. 이는 집합이 배열과 달리 순서가 없기 때문입니다.

집합의 요소에 접근할 수도 있습니다. 예를 들어, 다음과 같이 값을 직접 집합에서 제거할 수 있습니다:

예제5:remove() 메서드로 집합의 요소 접근

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

프로그램을 실행할 때, 출력은 다음과 같습니다:

Optional("cd")
["de", "ab", "bc"]

위 프로그램에서는 remove 메서드가 선택 가능한 문자열을 반환한다는 것을 볼 수 있습니다. 따라서 다음 선택적 처리를 수행하는 것이 좋습니다. 선택적에 대해 더 알고 싶다면, 다음 사이트를 방문하세요Swift 선택

예제6: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")
}

프로그램을 실행할 때, 출력은 다음과 같습니다:

cd
["de", "ab", "bc"]

집합에 새로운 요소를 어떻게 추가하나요?

Swift에서 insert() 메서드를 사용하여 집합에 새로운 요소를 추가할 수 있습니다.

예제7:insert() 메서드로 새로운 요소 추가

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

프로그램을 실행할 때, 출력은 다음과 같습니다:

["ab", "de", "cd", "ef", "bc"]

위 프로그램에서는 집합의 insert() 메서드를 사용하여 집합에 새로운 요소를 추가합니다. 집합이 순서가 없기 때문에 요소가 추가될 위치는 알 수 없습니다.

집합의 연산

집합의 또 다른 주요 장점은 집합 연산을 수행할 수 있다는 점입니다. 예를 들어, 두 집합을 합쳐서 결합하거나 두 집합이 공통된 값이 있는지 결정하는 등의 연산이 있습니다. 이러한 연산은 수학에서의 집합 연산과 유사합니다.

1.합집합

두 집합 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]

2.교집합

두 집합 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 집합에서 모두 존재합니다.

3.차집합

두 집합 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]의 새로운 집합.

4.대칭 차집합

두 집합 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를 반환합니다.

예제5쌍集合 동등 연산

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:)  - 이 메서드는 두 집합이 공통된 값이 있는지 확인합니다.

예제6쌍集合 구성원 관계 연산

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具有一些共同的值。

集合内置函数和属性

1. isEmpty 属性

此属性确定集合是否为空。如果集合不包含任何值,它返回true,否则返回false。

예제7:isEmpty如何工作?

let intSet = [21, 34, 54, 12]
print(intSet.isEmpty)

프로그램을 실행할 때, 출력은 다음과 같습니다:

false

2.first 属性

此属性用于访问集合的第一个元素。

예제8:first如何工作?

let intSet = [21, 34, 54, 12]
print(intSet.first)

프로그램을 실행할 때, 출력은 다음과 같습니다:

Optional(54)

由于Set是无序集合,因此 first 属性并不能保证是该集合的第一个元素。 您很有可能会得到54以外的其他值。

同样,您可以使用 last 属性来访问集合的最后一个元素。

3.insert 函数 - 插入元素

insert函数用于在集合中插入/追加元素。

예제9:insert函数如何工作?

var intSet:Set = [21, 34, 54, 12]
intSet.insert(50)
print(intSet)

프로그램을 실행할 때, 출력은 다음과 같습니다:

[54, 12, 50, 21, 34]

4.reversed() - 反转集合

此函数以相反的顺序返回集合的元素。

예제10:reversed()如何工作?

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]

5.count - 집합에 있는 요소의 총 수를 반환합니다.

이 속성은 집합에 있는 요소의 총 수를 반환합니다.

예제11:count 계산은 어떻게 작동합니까?

let floatSet:Set = [10.2, 21.3, 32.0, 41.3]
print(floatSet.count)

프로그램을 실행할 때, 출력은 다음과 같습니다:

4

6. removeFirst - 삭제하고 반환하는 집합의 첫 번째 값

이 함수는 집합에서 첫 번째 값을 삭제하고 반환합니다.

예제12:removeFirst 함수는 어떻게 작동합니까?

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 함수를 사용하여 집합을 비우실 수 있습니다.