집합은 콜렉션의 순서에 상관없이 다른 값을 저장한다. 아이템 순서가 중요하지 않거나 아이템이 반복되면 안될 때, 사용 가능하다. 스위프트의 집합은 Foundation모듈의 NSSet클래스와 연결된다.
집합에 저장하기 위한 타입은 반드시 hashable이어야 한다. 즉, 해쉬 값을 계산할 수 있는 방법을 타입은 제공해야 한다. 스위프트의 기본 타입 String, Int, Double, Bool은 기본적으로 hashable이며, 집합의 값 또는 딕셔너리의 키 타입으로 사용이 가능하다. 연관된 값이 없는 열거형의 case값은 기본적으로 hashable이다.
var letters = Set<Character>()
//이는 문자로 구성된 집합으로 초기화 된 변수이다. <>이 안에 집합의 타입을 명시해준다.
letters.insert("a")
letters = []
//다음과 같이 타입이 같은 엘리먼트 주입이 가능하며, 또한 빈 배열 리터럴을 사용하여 빈집합 생성이 가능하다.
var favoriteGenres : Set<String> = ["Rock", "Jazz", "Folk"]
var favoriteGnres : Set = ["Rock", "Jazz", "Folk"]
//배열 리터럴을 통해 초기화 가능하다.
//스위프트의 타입유추 때문에 배열 리터럴 초기화 시 타입은 명시하지 않아도 되나,
//Set은 반드시 명시해야 집합으로 생성한다.
print(favoriteGenres.count)
//count프로퍼티를 통해서 아이템 갯수를 확인 가능하다.
if favoriteGenre.isEmpty {
print("A")
}
//다음과 같이 isEmpty 프로퍼티를 통해서 집합의 비어있는 여부 확인이 가능하다.
favoriteGenres.insert("POP")
//insert메서드를 호출해서 아이템을 추가할 수 있다.
favoriteGenres.remove("Rock")
favoriteGenres.removeAll()
//remove메서드를 통해서 아이템을 삭제할 수 있다.
//removeAll()을 사용하게 되면 모든 아이템을 삭제하게 된다.
if favoriteGenres.contains("Funk") {
print("B")
}
//contains메서드 호출을 통해 특정 아이템 포함 여부 조회가 가능하다.
for genre in favoriteGenres {
print("\(genre)")
}
//다음과 같은 경우,
//Rock
//Jazz
//Folk
//다음과 같이 출력된다. 하지만 집합은 인덱스가 없으므로,
//출력할 때마다 순서가 랜덤하게 바뀌며 출력된다.
for value in favoriteGenres.sorted() {
print(value)
}
// 다음과 같은 경우 집합이 순서를 가진 배열로 변경되어 인덱스를 가지고 값을 조회하게 된다.
//순차적으로 출력이 가능해진다.
a.intersection(b) //A교집합B
a.symmetricDifference(b) // (A합B) - (A교B)
a.union(b) // A합B
a.substracting(b) // A-B