 Apple Lover Developer & Artist

영속적인 디자인에 현대의 공감을 채워넣는 공방입니다

 Apple/Swift Programming Language

[Swift] 공식문서 씹어먹기: Collection Type - Dictionary

singularis7 2021. 10. 22. 15:30
반응형

Swift logo

Dictionary

Dictionary 는 Key-Value 쌍을 가지며 순서가 없는 Collection 이다. Generic Collection 으로 구현되어있으며 저장할 수 있는 Key와 Value가 명확하다.

따라서 같은 타입의 key 그리고 같은 타입의 value 값의 사이의 관계를 순서 없이 저장할 수 있다.

Dictionary 에서 각 value 는 유일한 key 값과 연결되어있어서 key 값은 value 를 구분할 수 있는 식별자 역할을 한다.

배열과 다르게 dictionary 내부의 자료에 대한 순서가 없으며 식별자를 통해서만 값을 찾을 수 있다.

Dictionary type을 축약형으로 표현할 수 있다.

  • 원본: Dictionary<Key, Value>
  • 축약본: [Key: Value] ← 선호되는 방식

initializer syntax 를 사용하여 특정 타입의 빈 Dictionary 를 생성할 수 있다.

var namesOfInteger: [Int: String] = **[:]**
// namesOfInteger is an empty [Int: String] dictionary

문맥상 key 와 value 에 대한 type 정보를 이미 알고 있는 경우, empty dictionary literal [:] 를 사용하여 빈 딕셔너리를 생성할 수 있다.

namesOfInteger[16] = "sixteen"
// namesOfIntegers now contains 1 key-value pair
namesOfInteger = [:]
// namesOfIntegers is once again an empty dictionary of type [Int: String] 

Dictionary literal 표현을 사용하여 새로운 Dictionary 를 생성하는 방법

Dictionary literal : [ key1: value1, key2: value2, ... ]

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

Dictionary 에 접근(Accessing) 및 수정(Modifying)하는 방법

Property

  • count : 딕셔너리 내부의 자료 개수를 찾아준다.
print("The airports dictionary contains \(airports.count) items.")
// Prints "The airports dictionary contains 2 items."
  • isEmpty : count property가 0인지 확인한다.
if airports.isEmpty {
    print("The airports dictionary is empty")
} else {
    print("The airports dictionary isn't empty")
}

Subscript

  • dictionary 에 새로운 item 을 추가하는 방법
airports["LHR"] = "London"
  • 특정 키에 연관된 값을 변경하는 방법
airports["LHR"] = "London Heathrow"
  • 특정 키에 대한 값을 받아오는 방법
if let airportName = airports["DUB"] {
    print("The name of the airport is \(airportName).")
} else {
      print("That airport isn't in the airports dictionary.")
}
  • 특정 키 값을 제거하는 방법
airports["APL"] = "Apple International"
// "Apple International" isn't the real airport for APL, so delete it
airports["APL"] = nil
// APL has now been removed from the dictionary

Method

  • updateValue(_:forKey:) : 특정 키에 대한 값을 설정하거나 갱신해주는 메서드
    • 키가 존재하지 많으면 새로운 값으로 설정
    • 키가 존재하면 값을 갱신한 후 이전 값을 반환
    • 키에 대한 value 값이 존재하지 않을 수 있어서 optional 값으로 반환
if let oldValue = airports.updateValue("Doublin Airport", forKey: "DUB") {
    print("The old value for DUB was \(oldValue).")
}
// Prints : The old value for DUB was Dublin.
if let airportName = airports["DUB"] {
    print("The name of the airport is \(airportName).")
} else {
    print("That airport isn't in the airports dictionary")
}
// Prints "The name of the airport is Dublin Airport."
  • removeValue(forKey:) : 특정 키-벨류 쌍을 제거하고 그 결과를 반환한다.
    • Dictionary 에 해당 키 값이 존재한다면 제거한 값을 반환한다
    • Dictionary 에 해당 키 값이 존재하지 않다면 nil 값을 반환한다.

Dictionary 에서 반복을 돌리는 방법

  • for-in loop 구문을 통해 dictionary의 key-value 쌍에 대해 iterate 를 돌릴 수 있다.
  • Dictionary 의 각 item은 (key, value) tuple을 반환한다.
  • 반복문을 돌릴 때 tuple 의 멤버를 임시 상수 혹은 변수의 일부로 decompose 할 수 있다.
for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}
  • 필요한 경우 Dictionary의 키 혹은 value 값을 keys, values property를 통해 별도로 가져와서 순회할 수도 있다.
for airportCode in airports.keys {
    print("Airport code: \(airportCode)")
    // Airport의 키값만 가져온다
}

for airportName in airports.values {
    print("Airport name: \(airportName)")
    // Airport의 벨류값만 가져온다.
}

Dictionary의 key와 value 값을 Array 의 인스턴스로 생서아하는 방법

let airportCodes = [String](airports.keys)
// airportCodes is ["LHR", "YYZ"]

let airportNames = [String](airports.values)
// airportNames is ["London Heathrow", "Toronto Pearson"]
  • Dictionary 는 순서가 정의되지 않았기 때문에 특정 순서로 순회하기 위해서는 sorted() method 를 사용해야한다.
반응형