[스위프트 대충보기] 3. 컬렉션타입
-
배열(array)과 딕셔너리(dictionary)라는 두 컬렉션 제공(두개만? 아님! generic collection을 지원함. 배열과 딕셔너리도 역시 그 일부임)
-
배열: 같은 타입의 원소를 저장하는 순서가 있는(ordered) 컬렉션
-
딕셔너리: 키(key)와 값(value)의 대응 관계(association)를 순서 없이 저장한 컬렉션. 키는 한 딕셔너리 안에서 유일함.
-
배열은 NSArray나 NSMutableArray 클래스와 다름(원소 타입이 있다는 점에서)
-
배열 타입은 Array이라고 쓰나, 짧게 SomeType[]이라고도 쓸 수 있음
-
배열 리터럴: [원소1,원소2,...] let x = [1,2,3,4,5]
-
배열 참조: x[0] 0부터 인덱스 시작
-
원소갯수: x.count
-
빈 배열여부 확인: x.isEmpty
-
원소추가: x.append
-
배열 붙이기: x += [6,7,8]
-
원소변경: x[0] = 0
-
원소변경(범위지정): x[0...2] = [10,11] (3개의 원소를 2개로 대치했으므로 길이가 1 줄어듦)
-
변경이나 범위지정은 기존 인덱스 범위를 넘어서는 부분에 무언가를 넣는 용도로는 사용 불가. 예: x.count가 5인 배열에 x[5] = 10이라고 대입 불가.
-
원소 삽입: x.insert(0, atIndex: 0)
-
원소 삭제: x.removeAtIndex(1)
-
마지막 원소 삭제: x.removeLast
-
-
배열 이터레이션: for i in x { ... }
-
배열 이터레이션(인덱스까지) for (index, value) in enumerate(x) { ... } // global enumerate 함수 사용
-
배열을 비우려면, x = [] 라고 해서 비울 수 있음(길이가 0인 배열이 됨. 타입은 그대로)
-
같은 원소를 반복해 초기화: var threeDoubles = Double[](count: 3, repeatedValue: 0.0)
-
배열 concatenation : + 사용. arr1 + arr2
-
딕셔너리 : 역시 NSDictionary, NSMutableDictionary 와 달리 키, 값의 타입을 지정해야만 함
-
딕셔너리 타입은 Dictionary<KeyType, ValueType>
-
KeyType은 해시가능한 타입이어야 함. 예: 기본타입들(String, Int, Double, Bool), 이넘(enum)...
-
딕셔너리 리터럴: [ k1: v1, ..., kn: vn]
-
딕셔너리 원소갯수: x.count
-
딕셔너리 원소 추가(변경) 1: x[newKey] = newValue
-
딕셔너리 원소 추가(변경) 2: x.updateValue(newValue, forKey: oldKey) : 옛날 값을 ValueType? 타입(옵션타입임!)으로 반환(즉, 없었다면 null이고, 옛날 값이 있었다면 반환값 뒤에 !를 붙여서 원소를 찾거나 if let v = ... 바인딩으로 원소를 찾아 처리 가능)
-
딕셔너리 검색: x[keyVal] : 역시 ValueType? 타입임
-
딕셔너리 원소삭제 1: x[keyVal] = nil
-
딕셔너리 원소삭제 2: x.removeValueForKey(kevVal) 역시 기존 값을 ValueType? 타입으로 리턴함
-
-
이터레이션: for (key, value) in dict { ... }
-
키만 이터레이션: for key in dict.keys { ... }
-
값만 이터레이션: for value in dict.values { ... }
-
키만 배열로 가져오기: Array(dict.keys)
-
값만 배열로 가져오기: Array(dict.values)
-
주의: 이터레이션시 순서는 정해져 있지 않음
-
빈 딕셔너리 생성: Dictionary<Int, String>()
-
기존 딕셔너리 모든 원소 삭제: namesOfIntegers = [:]
-
컬렉션의 변경가능성(mutability)
-
var로 배열이나 딕셔너리를 만들면 변경가능 컬렉션이어서 컬렉션의 크기를 변경할 수 있음(즉, 원소를 자유롭게 추가 삭제 가능)
-
let으로 배열이나 딕셔너리를 만들면, 변경불가능 컬렉션이기 때문에, 크기를 변경할 수는 없음(즉, 원소를 추가하거나 삭제할 수 없음)
-
(let으로 선언한) 상수 딕셔너리의 경우에는 원소 업데이트도 금지됨. 즉, dict["key"] = "value" 하면 컴파일 안됨.
-
배열에서는 원소 삭제나 삽입, 추가는 안되지만, 어떤 인덱스에 해당하는 원소를 바꿔치는 것은 가능. 즉, arr[0] = 10 같은게 가능(물론 arr의 count에 따라 다름)
-
감상: 뭐.. ^^ 있을게 있음. 별다른 것 없음
다른 언어 쓰던 사용자들도 상당히 쉽게 스위프트 언어 자체는 접근 가능할듯. 물론 코코아를 얼마나 잘 사용할 수 있는가는 또 다른 문제임.