본문 바로가기

iOS

[iOS] [Swift] The Swift Language Guide - 3. 콜렉션 타입 (Collection Types)

콜렉션 타입 (Collection Types)


Swift 에서는 콜렉션 타입으로 배열, 셋, 사전 세 가지를 지원합니다.

 

image



배열 (Array)



배열 타입은 Array로 기재할 수 있으며 축약형으로 `[Element]` 형태로 사용할 수 있습니다.

빈 배열의 생성


 

아래와 같이 Int 배열 타입의 빈 배열을 생성할 수 있습니다.

var intArray = [Int]()

intArray.append(3)
// 배열에 3을 추가하였습니다.

intArray = []
// 배열을 재초기화 하였습니다. 배열의 아이템 타입은 그대로 Int로 유지됩니다.



기본 값으로 빈 배열 생성


 

repeating 메소드와 count 메소드를 이용하여 기본 값으로 빈 배열을 생성할 수 있습니다.

var threeDoubels = Array(repeating: 0.0, count: 3)
// threeDoubles: [0.0, 0.0, 0.0]



다른 배열을 추가한 배열의 생성


 

덧셈 연산자(+) 를 통해 배열을 합칠 수 있습니다.

 

var anotherThreeDoubles = Array(repeating: 9.9, repeating: 3)
// anotherThreeDoubles: [9.9, 9.9, 9.9]

var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles: [0.0, 0.0, 0.0, 9.9, 9.9, 9.9]



배열의 접근 및 변환


 

배열의 원소 갯수 확인

 

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

print("The shopping list contains \(shoppingList.count) items.")
// The shopping list contains 2 items.

 

배열이 비었는지 확인

if shoppingList.isEmpty {
    print("The shopping list is empty.")
} else {
    print("The shopping list is not empty")
}

 

배열에 원소 추가

shoppingList += append("Four")
// shoppingList.count = 3

shoppingList += ["Baking Powder"]
// shoppingList.count = 4
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList.count = 7

 

배열의 특정 위치의 원소 접근

var firstItem = shoppingList[0]
// firstItem: "Eggs"


특정 위치에 원소 추가/삭제/접근

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

let mapleSyrup = shoppingList.remove(at: 0)

firstItem = shoppingList[0]
// firstItem: "Six Eggs"

let butter = shoppingList.removeLast()



셋 (Set)


Set 형태로 저장되기 위해서는 반드시 타입이 Hashable 이어야만 합니다.

Swift에서 String, Int, Double, Bool, 과 같은 기본 타입은 기본적으로 Hashable 프로토콜을 준수합니다.

Hashable 프로토콜은 정수 Hash 값을 제공하는 타입을 의미합니다.

이는 즉, 그 자체로 유일하게 표현이 가능한 방법을 제공해야 한다는 의미를 갖습니다.

Swift에서 Set 타입은 Set 을 통해 선언합니다.

 

빈 Set 생성


 

var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.")
// letters is of type Set<Character> with 0 items.

letters.insert("a")
letters = []

 

배열 리터럴을 이용한 Set 생성


 

var favoriteGenres: Set<String> = ["Rock", "Classical", "HipHop"]


Swift의 타입 추론으로 아래와 같이 선언도 가능합니다.

var favoriteGenres: Set = ["Rock", "Classical", "HipHop"]



Set의 접근과 변경


 

print("I have \(favoriteGenres.count) favorite music genres.")
// I have 3 favorite music genres.

 

원소 추가

favoriteGenres.insert("Jazz")

원소 삭제

if let removedGenre = favoriteGenres.remove("Rock") {
    print("\(removedGenre)? I'm over it.")
} else {
    print("I never much cared for that.")
}
// Rock? I'm over it.

값 확인

if favoriteGenres.contains("Funk") {
    print("I get up on the good foot.")
} else {
    print("It's too funky in here.")
}
// It's too funky in here.



Set의 명령


let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

oddDigits.union(evenDigits).sorted()
// union: 합집합 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

oddDigits.intersection(evenDigits).sorted()
// intersection: 교집합 = []

oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// subtracting: 차집합 = [1, 9]

oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// symmerticDifference: 대칭차집합 = [1, 2, 9]



사전 (Dictionaries)


Swift의 String 타입이 Foundation 클래스의 NSString 을 브릿지한 타입이라고 공부하였습니다.

Swift의 Dictioanry 또한 마찬가지로 Foundation 클래스의 NSDictionary 를 브릿지한 타입이므로 NSDictionary의 메소드를 캐스팅 없이 사용할 수 있습니다.

 

축약형 Dictionary


[Key: Value] 형태로 Dictionary를 선언하여 사용할 수 있습니다.



빈 Dictioanry 생성


 

var namesOfIntegers = [Int: String]()

namesOfIntegers[16] = "sixteen"
namesOfIntegers = [:]
// 빈 사전

 

리터럴을 이용한 Dictionary 생성 및 값 변경


 

[key 1: value 1, key 2: valeu2, key 3: value3] 과 같은 형태로 사전을 선언할 수 있습니다.

var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

airportsp["LHR"] = "London"