CLOSE SEARCH

Swift – let collections = [“Array”, “Dictionary”]

Swift는 두가지 컬렉션 자료형을 제공합니다. Objective-C의 컬렉션은 모든 종류의 객체를 저장할 수 있었지만, Swift는 저장할 수 있는 자료형의 종류를 엄격하게 제한합니다. 예를 들어, String 배열에는 String만 저장할 수 있고, Int를 저장하는 것은 오류입니다. 이로 인해 컬렉션 자료형의 융통성은 거의 없어졌지만, 컬렉션에서도 일반화 프로그래밍의 이점을 얻게 되었습니다.

컬렉션의 가변성

Objective-C에서는 가변형과 불변형 객체를 위한 클래스를 별도로 제공했습니다. Swift에서는 MutableArray 또는 MutableDictionary라는 자료형이 따로 존재하지 않습니다. 일반적으로 불변형 컬렉션을 선언할 때는 let, 가변형 컬렉션을 선언할 때는 var를 사용하게 됩니다. let으로 선언하는 경우에는 컬렉션의 성능이 최적화되므로, 변경할 필요가 없는 컬렉션을 선언할 때는 이러한 이점을 염두에 두어야 합니다.

 

배열

Objective-C의 NSArray, NSMutableArray와 달리 Swift의 배열에는 동일한 자료형을 가지는 값만 저장할 수 있습니다. 배열을 선언할 때는 Array<T>와 같이 T에 저장할 자료형을 명시적으로 지정해 주는 방식을 사용해야 하지만, T[]와 같이 단순화된 형태를 주로 사용합니다.

배열의 리터럴은 Objective-C의 배열 리터럴에서 @가 제거된 형태입니다.

배열을 선언하는 방법은 다음과 같습니다.

shoppingList는 문자열을 저장하는 배열이고, Eggs와 Milk 두 개의 요소로 초기화 됩니다. 이 배열을 var로 선언한 이유는 나중에 새로운 요소를 추가하거나 삭제하기 위해서 입니다. 요소가 변경되지 않는다면 let을 사용해서 상수로 선언해도 됩니다.

Swift는 형식 추론이 가능하기 때문에, 코드 1-2는 다음과 같이 줄여서 쓸 수 있습니다. 배열 리터럴에 있는 모든 요소가 문자열이기 때문에 String 배열이라고 추론할 수 있는 것입니다.

만약 shppingList 배열을 뒤에서 다시 빈 배열로 선언할 때는 다음과 같이 할 수 있습니다.

이 시점에서는 자료형을 추론할 충분한 정보(코드 1-3)가 있기 때문에 빈 배열이지만 여전히 자료형은 String[] 이 됩니다.

배열을 초기화 할 때 요소의 수와 기본 값을 설정할 수도 있습니다. repeatedValue로 전달된 값으로 자료형을 추론할 수 있기 때문에 2번 라인과 같이 방식으로 배열을 초기화 할 수도 있습니다.

배열에 포함된 요소의 수는 count 속성을 통해 확인할 수 있습니다.

그리고 isEmpty 속성을 통해 배열이 비어있는지 확인할 수 있습니다.

배열에 하나의 요소를 추가할 때는 append 함수나 += 연산자를 사용합니다. 이것은 Objective-C의 addObject: 메소드와 동일하게 배열에 마지막에 요소를 추가합니다.

+= 연산자의 경우 두개 이상의 요소를 동시에 추가할 수도 있습니다. NSMutableArray의 addObjectsFromArray:와 동일한 역할을 한다고 생각하면 쉽게 이해할 수 있습니다.

특정 위치에 있는 요소의 값을 읽거나 설정할 때는 인덱스를 사용합니다. 이러한 문법을 Subscript syntax라고 합니다. 이 방식은 이미 존재하는 요소에만 적용할 수 있으며, [ ] 사이에 배열의 범위를 벗어나는 인덱스를 사용하는 경우에는 런타임 오류의 원인이 됩니다.

Swift 배열의 강력한 기능 중 하나는 [ ] 사이에 범위 연산자와 유사한 문법을 써서 범위를 지정할 수 있다는 것입니다. 아래의 코드는 shoppingList 배열의 요소 중 인덱스 값 4 ~ 6 사이의 값을 새로운 값으로 대체합니다.

특정 인덱스에 요소를 추가할 때는 insert(atIndex:) 메소드를 사용합니다.

반대로 특정 인덱스에 있는 요소를 삭제할 때는 removeAtIndex 메소드를 사용합니다. 이 메소드는 Objective-C의 removeObjectAtIndex: 메소드와 동일한 역할을 수행하지만, 삭제된 값을 리턴한다는 차이점을 가지고 있습니다.

배열의 마지막 요소를 삭제할 때는 removeLast 메소드를 사용합니다. 이 메소드 역시 요소를 삭제한 후에 삭제된 값을 리턴합니다.

배열을 순회할 때는 주로 for-in 반복문을 사용하게 됩니다.

만약, 반복문에서 각 요소의 인덱스 값도 사용해야 한다면 전역함수 enumerate로부터 리턴받은 튜플을 사용해서 순회할 수도 있습니다. 이 튜플에는 배열에 포함된 각 요소의 인덱스와 값이 저장되어 있습니다.

문자열과 마찬가지로 배열 역시 + 연산자를 통해 아주 간편하게 병합할 수 있습니다. 새로운 배열의 자료형은 병합되는 각 배열의 요소 값을 통해 추론됩니다.

 

딕셔너리

Swift의 딕셔너리는 키와 값의 쌍을 저장하는다는 측면에서는 Objective-C의 딕셔너리와 유사하지만, 키와 값의 자료형을 명시적으로 지정해 주어야 합니다. NSDictionary, NSMutableDictionary 키의 경우 NSCoding 프로토콜을 따르는 모든 객체로 지정할 수 있고, 모든 객체를 값으로 저장할 수 있습니다. Swift에서는 Dictionary<k, v>와 같은 형태로 키와 값의 자료형을 지정하여 선언해야 합니다. Swift의 딕셔너리 키는 NSCoding 코딩을 따를 필요는 없지만, 반드시 해시가 가능해야 합니다.

딕셔너리의 리터럴은 Objective-C의 리터럴에서 @가 빠지고, { 대신 [ 가 사용된 형태입니다.

기본적인 딕셔너리는 다음과 같이 선언하고 초기화합니다.

airports 딕셔너리의 키와 값의 자료형은 모두 문자열이고 두개의 요소로 초기화됩니다. 딕셔너리 역시 배열과 마찬가지로 초기값을 통해 자료형을 추론할 수 있기 때문에 다음과 같이 간소화된 코드를 사용할 수도 있습니다. 2번 라인과 같이 airports 배열을 빈 배열로 만들수도 있습니다.

딕셔너리에 포함된 요소의 수는 count 속성을 통해 확인할 수 있습니다.

딕셔너리에 새로운 요소를 추가하거나 특정 키의 갑을 변경할 때는 Subscript syntax 문법을 사용합니다.

그리고 코드 2-4와 동일한 역할을 수행하는 updateValue(forKey:) 메소드도 제공합니다. Subscript syntax와 마찬가지로 forKey:로 지정한 키가 존재하는 경우 해당 키의 값을 변경하고, 존재하지 않는 경우에는 새로운 키와 값의 쌍으로 추가합니다.

이 메소드는 변경되거나 추가되기 이전의 원본 값을 리턴하므로 값의 변경을 확인하는데 사용할 수도 있습니다. 리턴되는 값은 Optional 이기 때문에 Swift에서 새롭게 제공하는 Optional Binding의 이점을 활용할 수 있습니다.

oldValue의 자료형은 String?으로 추론되고, 딕셔너리에 “SEO” 키가 존재하는 경우 원본 값이 리턴되므로 if 문의 코드가 수행됩니다. 만약 “SEO” 키가 새롭게 추가되는 경우에는 이전 값이 존재하지 않아 nil을 리턴하게 되므로 if문의 코드는 수행되지 않습니다.

또한, Optional Binding과 Subscript syntax를 조합해서 다음과 같이 딕셔너리의 값을 확인하는 코드를 작성할 수도 있습니다.

특정 키/값의 쌍을 딕셔너리에서 삭제할 때는 다음과 같은 코드를 사용합니다.

삭제시에도 Optional Binding의 이점을 충분히 활용할 수 있습니다.

for-in 반복문을 사용하면 딕셔너리에 포함된 각 요소를 순회할 수 있습니다. 반복문에서 각 요소는 (키, 값) 형태의 튜플로 리턴됩니다. Swift에서는 딕셔너리의 키 또는 값이 정렬되어 있지 않기 때문에, 반복문을 사용할 때 순서에 주의해야 합니다.

그리고 keys, values 속성을 사용해서 키와 값에 개별적으로 접근할 수도 있습니다.

키 또는 값의 컬렉션을 배열 형태로 사용하려면 반드시 Array 인스턴스를 생성해야 합니다.

 

 

 

ps. Facebook 페이지에 가입해서 함께 정보를 공유해보아요 :)   https://www.facebook.com/groups/254425194763076/

이 글의 예제 코드는 다음에서 발췌하였습니다: Apple Inc. ‘The Swift Programming Language.’ iBooks. https://itun.es/kr/jEUH0.l

Filed under: Swift