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
타입을 통해 간단히 만들 수 있었다.
사전
사전은 키-값 쌍을 저장하는 유용한 수단이다. NSDictionary
나 NSMutableDictionary
가 키나 값의 타입에 큰 제약이 없었음에 비해 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)