
스위프트는 배열, 집합, 딕셔너리 세 개의 주요 컬렉션 타입을 지원한다. 값을 순서대로 접근 가능한 배열, 값(중복 값이 없음)을 순서 없이 모아놓은 집합, 키 값으로 값에 접근 가능한 딕셔너리를 통해 값을 저장, 반환할 수 있다.
컬렉션 타입으로 값을 저장할 때 이 컬렉션은 mutable, 즉 값이 변할 수 있다. 값을 추가하거나, 삭제하거나, 바꾼 이후에도 여전히 값을 바꿀 수 있다는 말이다. 반면, 만일 컬렉션 타입을 상수로 할당한다면 immutable해지므로 크기나 내용은 바꿀 수 없다.
immutable한 컬렉션은 그렇다면 소용이 없을까? 어떤 종류의 값을 사용하는지에 따라 달라진다. 이후 값을 고정적으로 사용하는 값이라면 상수로 설정하자. 스위프트 컴파일러 최적화 지원을 통해 더 높은 성능을 얻을 수 있다.
배열은 같은 타입의 데이터를 순서대로 저장한다. 이때 데이터는 같은 값, 즉 중복이어도 상관없다.
특정 타입의 배열을 선언하려면 Array<Element>로 작성해야 하지만 스위프트는 [Element]라는, 타입을 대괄호로 둘러싼 형태로도 배열이라 인식한다.
var array_int: [Int] = []을 통해 빈 배열을 선언할 수 있다. 이처럼 [Int]이라는 정보를 주지 않아도 문맥 상 함수 파라미터 등으로 추론 가능한 정보를 통해 빈 배열을 선언할 수 있다.
array_int.append(3)
array_int = []
위 경우 array_int는 정수 데이터 타입의 배열임을 빈 배열을 주기 전에 알 수 있었다.
동일한 디폴트 값을 배열에 주면서 선언할 수 있다. 어떤 디폴트 값(repeating)을 몇 번(count) 넣을 건지 알려주기만 하면 된다.
var array_default = Array(repeating: 3, count: 6)
// array_default: [3, 3, 3, 3, 3, 3]
배열 두 개를 합쳐 새로운 배열을 만들 수 있다.
var array_int1 = Array(repeating: 3, count: 3)
var array_int2 = Array(repeating: 4, count: 2)
var array_int3 = array_int1 + array+int2
// array_int3: [3, 3, 3, 4, 4]
직접 리터럴로 값을 줄 수도 있다. , 콤마로 값을 구분하고 [] 안에 값을 넣자.
var array_literal: [String] = ["Hello", "Swift"]
이때 array_lieteral은 String 타입만 받아들이는 배열로 선언되었고, 리터럴로 넣어준 값을 통해 초기화된다.
배열 메소드와 프로퍼티를 통해 값에 접근하거나 수정하자.
Array.isEmpty 프로퍼티는 배열이 비었는지 확인한다. 비었다면 True, 값이 있으면 False를 return
Array.append() 또는 += 연산자를 통해 값을 추가할 수도 있다.
var array_str:[String] = ["Hello"]
array_str.append("Swift")
// array_str: ["Hello", "Swift"]
array_str += ["This", "is", "Example"]
// array_str: ["Hello", "Swift", "This", "is", "Example"]
[]를 통해 접근)를 통해 값을 꺼내올 수 있다.let first_item = array_str[0]
// first_item: "Hello"
array_str[1] = "Python"
// array_str: ["Hello", "Python", "This", "is", "Example"]
서브스크립트 문법을 사용할 때에는 지금 접근하는 인덱스가 과연 이 인스턴스에서 유효한지 확인하자. 넣어주는(바꿔주는) 값도 이 인스턴스 타입과 맞는지 확인해야 한다.
array_str[2...4] = ["New", "String"]
// array_str: ["Hello", "Python", "New", "String"]
이때 주어지는 범위 [...]에 이 범위보다 더 많거나 적은 수의 값을 넘기더라도 허용된다.
Array.insert(at: ) 메소드를 통해 특정 인덱스에 값을 넣어줄 수 있다.array_str.insert("The", at: 2)
// array_str: ["Hello", "Python", "The", "New", "String"]
삽입한 인덱스 바로 그곳에 값이 들어가며, 나머지 값이 있다면 자동으로 뒤로 밀린다.
Array.remove(at: ) 메소드를 통해 특정 인덱스 값을 삭제할 수 있다.array_str.remove(at: 1)
// array_str: ["Hello", "The", "New", "String"]
이때 remove 메소드는 값을 배열에서 삭제하면서 반환하는데, 파이썬의 pop()과 같다. Array.removeLast() 메소드는 이때 배열의 마지막 값만 배열에서 삭제하고 반환한다.
스위프트가 지원하는 인덱스는 제로 베이스이기 때문에 1부터가 아니라 0부터 시작한다는 데 주의하자. 따라서
Array.count프로퍼티로 확인한 배열의 총 길이n이 있다면 이 배열의 마지막 인덱스n-1이다.
for item in array_str {
print(item)
}
// Hello
// The
// New
// String
enumerated() 메소드를 통해 확인할 수 있다.for (idx, val) in array_str.enumerated() {
print("Item \(idx + 1): \(val)")
}
// Item 1: Hello
// Item 2: The
// Item 3: New
// Item 4: String
enumerated()를 통해 가져온 인덱스 역시 0부터 시작한다는 데 주의하자.