컬렉션 타입
Swift는 값의 모음을 저장하기 위해 배열(Array), 집합(Set), 사전(Dictionary), 튜플(Tuple)을 제공한다. 튜플을 제외하고는 저장되는 값이 모두 같은 타입이어야만 한다. 당연하게도 컬렉션 타입을 var(변수)에 할당하면 변경이 가능, let(상수)에 할당하면 변경이 불가능하다.
배열(Array)
배열은 정렬된 값의 모음이다. 배열은 Index(0부터 시작하는 순서)를 가지고 있다. Index를 통해 배열에 저장된 값을 불러올 수 있다. append, insert, contentsOf, remove 등을 사용하여 수정이 가능하다.
var someArray: [Int] = [1, 2, 3]
someArray[0]
//1
someArray[1]
//2
someArray.count
//3
var someNum: Int = 5
someArray.append(someNum)
//[1, 2, 3, 5]
someArray.insert(someNum, at: 1)
//[1, 5, 2, 3, 5]
someArray.append(contentsOf: [9, 10, 11])
//[1, 5, 2, 3, 5, 9, 10, 11]
var cities: [String] = ["Seoul", "Tokyo", "New York", "Santiago"]
var length = cities.count
//조건이 변수에 저장되어 효율적
for i in 0..<length {
print("\(i)번째 도시는 \(cities[i])입니다")
}
for i in cities {
let index = cities.index(of: i) //.index(of: ) 메소드는 String을 인자값으로 받고 Int?를 리턴한다.
print("\(index!)번째 도시는 \(i) 입니다.")
}
배열의 순회탐색을 위해서 for-in 구문내에서 배열의 .count를 사용하는 경우, 배열의 크기가 작다면 상관없지만 크기가 크다면 변수나 상수에 할당하여 설정하는 것이 더욱 좋다.
그 이유는 for-in 구문은 조건식을 평가할때마다 배열의 크기를 매번 다시 계산하기 때문이다.
배열이 비어있는지 확인하기 위해서는 .isEmpty 를 사용할 수 있다.
특정값이 있는 확인 하기 위해서는 .contains() 을 사용할 수 있다.
index(of:)는 값의 index를 알 수 있다.
집합(Set)
집합은 정렬되지 않은 고유한 값이다.
순서가 중요하지 않거나 한번만 표시해야 하는 경우 배열 대신 사용된다.
즉 집합은 중복 없이 저장하고자 할때 사용된다.
그렇기 때문에 이미 있는 값을 저장하면 아무일도 발생하지 않는다.
집합은 intersection(:), symmetricDifference(:), union(:), subtract(:) 등을 사용하여 연산이 가능하다.
var randomSet: Set<String> = [] //초기값이 없을 경우 제네릭을 통해 타입을 명시해야 한다.
var someSet: Set = [3, 2, 1]
var someSet2: Set = [1, 2, 5]
var someSet.insert(3) //[3, 2, 1]
someSet.intersacton(someSet2) //[1, 2]
someSet.symmetricDifference(someSet2) //[3, 5]
someSet.union(someSet2) //[1,2,3,5]
someSet.subtrat(someSet2) //[3]
var someArray: [Int] = [1, 1, 3, 3, 5, 5, 7, 7, 9, 9]
var someSet = Set(someArray) //집합의 특성상 중복값이 제거된다. 그러나 순서는 정렬되지 않는다.
//[9, 1, 3, 7, 5]
var someSet: Set = [1, 3]
someSet.insert(3) // [1, 3]
someSet.update(with: 3) // [1, 3]
위 경우 결과값의 차이는 없지만 insert(:)의 경우 중복된 값을 더하려는 이유로 false를 반환하고 값을 더하지 않는다. (중복이 없기 때문)
반면 update(with:)의 경우 값이 있든 없든 무조건 새 값으로 변경이 된다.
사전(Dictionary)
var someDic: [String : Int] = ["경기도" : 031, "서울" : 02]
someDic["경기도"] //031
키 - 값 연관의 정렬되지 않은 모음이다.
키 값을 통해 데이터에 접근한다. 이 때문에 키 값은 중복될 수 없다.
아이템에 index 는 없지만 키에는 내부적으로는 순서가 있기에 for-in 구문을 통해 순회 탐색이 가능하다.
updateValue 메소드는 기존의 아이템이 없다면 추가를 하고 nil을 반환, 이미 존재한다면 기존 값을 반환한다.
저장된 값을 제거할 때에는 nil값을 주는 방법과 removeValue 메소드 두 가지를 사용할 수 있다. reomoveValue를 사용하면 삭제된 값은 removedValue로 사용할 수 있다.
튜플(Tuple)
튜플은 한 가지 타입의 아이템만 저장할 수 있는 다른 컬렉션 타입과 다르게 여러 가지의 아이템을 동시에 저장할 수 있다. 그러나 상수적 성격을 띠므로 값을 추가하거나 삭제하는 것은 불가능하다. 튜플은 배열의 index와는 다르게 속성을 통해 이용한다. 튜플은 바인딩을 통해서 각각을 변수나 상수로 할당하는 것이 가능하다.
var someTuple: (Int, String, Bool) = (3, "안녕", true)
//속성을 통한 접근
someTuple.0 //3
someTuple.1 //안녕
someTuple.2 //true
//바인딩을 통한 할당
let (a, b, c) = someTuple
a //3
b //안녕
c //true