Swift Collection Types

Collection Types

배열은 동일한 타입의 원소의 집합이다.

배열의 초기화

var shoppingList: String[] = ["Eggs", "Milk"]

배열의 타입이 String[]이며, 이는 String타입과는 다르다. 타입추론이 가능하므로 위 구문은 아래와 같이 줄여 쓸 수 있다.

var shoppigList = ["Eggs", "Milk"]

배열은 수정 가능하다.

배열은 수정이 가능하다.

shoppingList.append("Flour")

이외에도 += 연산자를 사용해서,

shoppingList += "Baking Powder"

와 같이 쓸 수도 있다. 물론 원소 하나가 아닌 배열끼리 연결도 가능하다.

위와 같이 쓸 수 없다. Xcode6 Beta5 이후로는 배열은 배열끼리만 덧셈을 통해서 연결할 수 있고, 개별 원소는 .append(_)를 써서 추가해야 한다.

shoppingList += ["Chocolate Spread", "Cheese", "Butter"]

Xcode6 Beta 4 이전 버전에서는 [Type] + Type의 연산은 appending이었으나, 명료성을 위해 이 기능은 제거되고, + 연산자는 반드시 배열과 배열 사이에서만 가능해졌다. (배열에 원소를 확장하려면 반드시 .append()를 사용해야 한다.)

배열의 원소, 부분집합

배열은 인덱스를 통해서 개별 원소나 부분집합을 꺼낼 수 있다.

shoppingList[0]
shoppingList[4..6] // 4 , 5 번을 꺼낸다. 

이는 배열 타입의 subscript의 정의를 따른다. 마찬가지로, 사전 타입의 경우에도 동일한데, 이는 임의의 클래스나 구조체에 대해서 subcript 문법을 정의한다면, 같은 문법을 사용할 수 있다는 의미가 된다. 또한 이 subscript는 오버로딩이 가능하기 때문에 동일한 타입에서 정수키를 사용하면서 문자열 키를 사용하는 식의 활용도 생각해볼 수 있다.

mutable한 배열의 경우 중간에 원소를 삽입하거나 삭제하는 것도 된다.

shoppingList.insert("Maple Syrup", atIndex: 0)

removeAtIndex()는 특정 위치의 원소를 뽑아 제거한다. 그리고 제거한 값을 리턴한다.

let mapelSyrup = shoppingList.removeAtIndex(0)

반대로 뒤에서 꺼내오는 것도 있다.

let apples = shoppingList.removeLast()

빈 배열의 경우에는 제거할 것이 없을 수 있기 때문에 이 때는 nil을 리턴한다. 따라서 이 메소드들은 Type? 형, 즉 옵셔널 타입을 리턴한다.

이터레이션

for in 구문으로 배열을 순회할 수 있다.

for item in shoppingList {
    println(item)
}

만약 각각의 인덱스도 함께 필요하다면 enumerate 함수를 쓰면 된다.

for (index, item) in enumerate(shoppingList) {
    println("Item\(index + 1): \(value)")
}

초기화 방법들

그냥 코드로 보자.

var threeDoubles = Double[](count: 3, repeateValue: 0.0)
var anotherDoubles = Array(count: 3, repeateValue: 0.0)
var sixDoubles = threeDoubles + anotherDoubles

타입추론을 지원하므로 Array 타입을 통해 간단히 만들 수 있었다.

사전

사전은 키-값 쌍을 저장하는 유용한 수단이다. NSDictionaryNSMutableDictionary가 키나 값의 타입에 큰 제약이 없었음에 비해 Swift의 사전은 키, 값의 타입이 각각 정해져있어야 한다. 따라서 사전 타입은 Dictionary<Keytype, ValueType>으로 고정된다.

var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]

사전 자체는 mutable하다.

airports["LHR"] = "London Headthrow"

업데이트, 제거

업데이트나 제거시에는 기존 값을 리턴한다.

let oldValue = airports.updateValue("Dublin International", forKey: "DUB")
let removedValue = airports.removeValueForKey("DUB")

이터레이션

for (key, value) in airports {
    ...
}

키나 값만 배열로 뺄 수 있다. 단, 이것이 배열 객체는 아니므로(아마 그냥 이터레이터 객체인듯 싶다) 배열처럼 사용하기 위해서는 Array() 타입을 통해서 배열로 새로 만들어야 한다.

let airportCodes = Array(airports.keys)
let airportNames = Array(airports.values)