공부/SWIFT

[SWIFT] 컬렉션형 - 세트(Set)

알로하리미 2021. 3. 9. 15:25
728x90

1. 개요

- 같은타입의 데이터를 순서 없이 하나의 묶음으로 저장하는 형태의 컬렉션형

- 세트 내의 값은 모두 유일한 값

- 순서가 중요하지 않거나 각 요소가 유일한 값이어야하는 경우 사용

- Hashable 프로토콜을 따름 (스위프트의 기본 데이터 타입은 모두 Hashable하다.)

- 배열과 마찬가지로 [] 대괄호로 값을 묶어 세트 타입임을 표현

- 하지만 배열과 달리 축약형 없음 ( Array<Int>를  [Int]로 데이터 타입으로 표현했었다. )

- let 선언시 변경 불가능한 Set

- var 선언시 변경 가능한 Set

- 빈 세트는 이니셜라이저 또는 리터럴 문법을 통해 생성 할 수 있다.

- isEmpty 프로퍼티를 통해 비어있는 세트인지 확인

- count 프로퍼티를 통해 개수 확인

- 키워드 Set<타입이름>

 

 

2. 선언 및 확인

//빈 세트 생성
var num1: Set<Int> = Set<Int>()
var num2: Set<Int> = []

//배열과 마찬기지로 대괄호 사용
var num3: Set<Int> = [ 1, 2, 3, 4, 5 , 1 ]

//타입추론 사용시 그냥 배열로 타입을 지정
var num4 = [ 100, 200, 300 ] //배열 타입

print(num3.isEmpty) // false
print(num3.count) // 5   중복된 값은 허용 되지 않음. 하나로 통일 함.


//포함 되었는지 확인
let ingredients: Set = ["cocoa beans", "sugar", "cocoa butter", "salt"]
if ingredients.contains("sugar") {
    print("No thanks, too sweet.")
}
// Prints "No thanks, too sweet."

 

 

3. 집합 연산 수행

세트는 하나의 집합이라고 볼 수 있다.

contains(_:) 집합에 특정 요소가 포함되어 있는지 테스트합니다.


"같음"연산자 ( ==)를 사용하여 두 세트에 동일한 요소가 포함되어 있는지 테스트합니다.


isSubset(of:) : 부분집합인지 확인


isSuperset(of:) : 전체집합인지 확인


isDisjoint(with:) : 서로 배타적인지 확인 (겹치는게 없는지)



두 세트의 요소를 결합, 제외 또는 뺄 수도 있습니다.


union(_:) : 집합의 요소와 다른 집합의 요소를 합하여 새 집합을 만듭니다. (합집합)


intersection(_:) : 집합과 다른 집합에 공통된 요소 만있는 새 집합을 만듭니다. (교집합)


symmetricDifference(_:) : 집합이나 다른 집합에 있지만 둘 다에 있지 않은 요소로 새 집합을 만듭니다. (여집합의 합)


subtracting(_:) : 다른 집합이나 시퀀스에도없는 집합의 요소로 새 집합을 만듭니다. (차집합)
var primes: Set = [2, 3, 5, 7]

// primes집합이 0~10까지의 부분집합이냐?
print(primes.isSubset(of: 0..<10))
// "true"



let favoriteNumbers = [5, 7, 15, 21]
//primes집합과 favoriteNubers의 교집합은?
print(primes.intersection(favoriteNumbers))
// "[5, 7]"



//컬렉션 메서드를 사용할 수 있습니다.
if primes.isEmpty {
    print("No primes!")
} else {
    print("We have \(primes.count) primes.")
}
// Prints "We have 4 primes."



//요소들을 모두 더하시오
let primesSum = primes.reduce(0, +) 
// 'primesSum' == 17



//정렬한 다음 요소들을 문자열로 바꾸어 넣으시오
let primeStrings = primes.sorted().map(String.init) 
// 'primeStrings' == ["2", "3", "5", "7"]



//for- in루프 를 사용하여 세트의 정렬되지 않은 요소를 반복
for number in primes {
    print(number)
}



//컬렉션 메서드 사용시에 배열로 반환 하기때문에
//결과에서 Set으로 감싸서 새집합을 만든다.
let primesStrings = primes.map(String.init) //배열로 반환됨
let primesStringsSet = Set(primes.map(String.init)) //Set으로 감싸서 새집함 설정