본문 바로가기
iOS/Swift

[Swift] 컬렉션 타입 (Set)

by Jiseong 2021. 6. 5.

 

전에 배열을 정리해봤다

2021.06.03 - [Dev/Swift] - [Swift] 컬렉션 타입 (Array)

 

[Swift] 컬렉션 타입 (Array)

Swift는 Array, Dictionary, Set 세가지의 컬렉션 타입을 지원한다. 오늘은 그 중 배열 배열 (Array) 배열(Array)은 같은 타입의 데이터를 일렬로 나열한 후 순서대로 저장하는 형태의 컬렉션 타입이다. 배열

limjs-dev.tistory.com

오늘은 Set

 

Set

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

세트 내의 값은 모두 유일한 값, 즉 중복된 값이 존재하지 않는다.

그래서 세트는 보통 순서가 중요하지 않거나, 각 요소가 유일한 값이어야 하는 경우 사용한다.

또 세트의 요소로는 Hashable 값이 들어와야 한다.

 

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

하지만 배열과 달리 축약형으로 표현할 수 있는 뭐... 

Array<Int>을 [Int]로 줄이는 것처럼 축약할 수 없다.

무조건 Set<Int>... 이래 만들어야된다.

 

그렇지 않으면..? 

 

타입추론에 의해 컴파일러는 nums를 Set가 아닌 Array로 지정한다.

 

이래해주면 원하는대로 Set로 저장된다.

 

빈 Set 생성 및 초기화

var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.")
//letters is of type Set<Character> with 0 items.

 

추가 후 초기화

letters.insert("a")
print(letters)
//["a"]

letters = [] //init
print(letters)
//[]

여기서 letters = [] 를 해도 Set로 인식되는 이유는 앞에서 세트로 선언해줬으니깐 그런 것이다.

 

Set 생성

var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]

var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

축약을 할 수는 있다. 세트의 원소가 모두 같은 타입이라면..

 

세트 수정

//Count 프로퍼티로 세트 내의 요소 갯수 확인
print("I have \(favoriteGenres.count) favorite music genres.") 
//I have 3 favorite music genres.

//isEmpty 프로퍼티를 통해 비어있는 세트인지 확인
if favoriteGenres.isEmpty {
    print("As far as music goes, I'm not picky.")
} else {
    print("I have particular music preferences.")
}//I have particular music preferences.

//insert 메소드를 통한 요소 추가
favoriteGenres.insert("Jazz")
// favoriteGenres now contains 4 items

//remove 메소드를 통한 요소 삭제
if let removedGenre = favoriteGenres.remove("Rock") { //해당 요소가 삭제된 후 반환된다.
    print("\(removedGenre)? I'm over it.")
} else {
    print("I never much cared for that.")
}
// Rock? I'm over it.

//contains 메소드를 통한 특정 항목이 Set에 포함되어있는지 확인
if favoriteGenres.contains("Funk") { // false
    print("I get up on the good foot.")
} else {
    print("It's too funky in here.")
}
// It's too funky in here.

 

세트 반복

for genre in favoriteGenres {
    print("\(genre)")
}

//Sorted 메소드로 정렬 - 집합의 요소를 < 연산자를 사용하여 정렬된 배열로 반환
for genre in favoriteGenres.sorted() {
	print("\(genre)")
}

 

집합

 

 

 

let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

oddDigits.union(evenDigits).sorted() // union() 합집합
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

oddDigits.intersection(evenDigits).sorted() // intersection() 교집합
// []

oddDigits.subtracting(singleDigitPrimeNumbers).sorted() // subtracting() 차집합
// [1, 9]

oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted() // symmetricDifference() 배타적 논리합(XOR)
// [1, 2, 9]

 

부모, 자식 관계

 

 

let family: Set = ["mom","dad","sister","brother","me"]
let couple: Set = ["mom","dad"]
let siblings: Set = ["sister","brother","me"]
let siblings2: Set = ["sister","brother"]
let anotherSiblings: Set = ["sister","brother","you"]

print(couple.isSubset(of: family))
// couple은 family에 속해있는가?: true

print(couple.isSuperset(of: siblings))
 //couple은 siblings을 갖고있는가?: false
 
print(family.isSuperset(of: siblings)) 
//family는 siblings을 갖고있는가?: true

print(anotherSiblings.isStrictSubset(of: siblings2)) 
// anotherSiblings는 siblings2에 속하면서 두 세트의 크기가 다른가?: false

print(anotherSiblings.isStrictSuperset(of: siblings2)) 
// anotherSiblings는 siblings2를 갖고있고, 두세트의 크기가 다른가?: true

print(couple.isDisjoint(with: siblings)) 
// couple은 siblings와 공통요소가 없는가?: true

 

  • A.isSubset(of: B) - 특정 Set컬렉션이 다른 Set컬렉션을 가지는지 체크 - A가 B에 속하는지, 속하면 True
  • A.isSuperset(of: B) - isSubset(of:)의 반대, A가 B를 가지는지, 가지면 True
  • A.isStrictSubset(of: B) - isSubset 메소드에서 비교하는 두 Set의 크기가 동일하지않은지 체크 - 둘다 만족해야(비동일) True
  • A.isStrictSuperset(of: B) - isStrictSubset 와 isSubset의 관계와 동일
  • A.isDisjoint(with: B) - 공통요소, 즉 교집합이 없는가를 체크, A와 B가 공통요소가 없는지, 없으면 True

 

다음엔 Dict

'iOS > Swift' 카테고리의 다른 글

계산기  (0) 2021.08.07
[Swift] 컬렉션 타입 (Dict)  (0) 2021.08.02
MAC Xcode 신뢰할 수 없는 개발자 설정 방법  (0) 2021.06.04
[Swift] 컬렉션 타입 (Array)  (0) 2021.06.03
[Swift] Date Picker  (0) 2021.05.31

댓글