[Swift] 순서 사전, DictionaryLiteral

전치: Swift5의 변경점



코멘트에서 받았습니다만, DictionaryLiteral 라는 명칭은 Swift5에서 Deprecated가 되어, KeyValuePairs 에 Rename 되었습니다. ( @ 이즈메 씨 감사합니다!)

PR 을 본 느낌이라면 완전히 Rename만으로 기능은 변하지 않은 것 같습니다.Dictionary 그렇지만 Literal 그렇지 않은 배드 네이밍이니까 바꿨다는 것.

이 기사는 Swift3 시점에서 쓰여진 것이므로, 이후 DictionaryLiteral 라고 낡은 호칭으로 기술하고 있습니다만 용서해 주세요.

DictionaryLiteral이란?



Swift의 Dictionary는 해시 테이블이므로 빠른 조회가 가능하지만 반복 할 때 순서가 보장되지 않습니다.
let dict = ["0": 0, "1": 1, "2": 2, "3": 3]
for (key, value) in dict {
    print("\(key), \(value)")
}

출력은 이렇게 됩니다.
2, 2
1, 1
0, 0
3, 3

순서가 엉망이 되었습니다.

그렇다면 어쨌든 사전의 순서를 저장해 두고 싶을 때는 어떻게 하면 좋을까요? 실은, 순서 첨부의 사전은 준비되어 있습니다.

DictionaryLiteral이라는 것이 그것입니다. ExpressibleByDictionaryLiteral을 준수하므로 형식을 명시하면 사전의 리터럴을 그대로 대입할 수 있습니다.
let dict: DictionaryLiteral = ["0": 0, "1": 1, "2": 2, "3": 3]
for (key, value) in dict {
    print("\(key), \(value)")
}
0, 0
1, 1
2, 2
3, 3

순서가 유지됩니다. 또한 DictionaryLiteral은 RandomAccessCollection이므로 배열처럼 첨자 액세스할 수 있습니다. 키와 가치의 튜플이 반환됩니다.
print(dict[1])
("1", 1)

그러나 DictionaryLiteral은 Dictionary와 마찬가지로 사용할 수 없습니다. 불행히도 적어도 기능적인 측면에서 DictionaryLiteral은 [(String, Int)]와 같이 튜플 배열을 작성하는 것과 거의 다르지 않습니다.

예를 들어, 키를 지정하여 값을 검색할 수 없습니다. 지정된 키에 해당하는 값을 얻으려면 이렇게 하십시오.
let dict: DictionaryLiteral = ["0": 0, "1": 1, "2": 2, "3": 3]
if let index = dict.index(where: { $0.0 == "1" }) {
  let value = dict[index].1
  print("value: \(value)") // value: 1
}

또, 같은 키가 복수 있는 상태도 허용해 버립니다.
var dict: DictionaryLiteral = ["0": 0, "0": 1, "0": 2, "0": 3]
if let index = dict.index(where: { $0.0 == "1" }) {
  let value = dict[index].1
  print("value: \(value)") // value: 1
}

그렇다면 어떤 때에 DictionaryLiteral을 사용하면 좋을까요? 문서에는 다음이 있습니다.

Use a DictionaryLiteral instance when you need an ordered collection of key-value pairs and don’t require the fast key lookup that the Dictionary type provides.
  • 순서 첨부 사전이 필요할 때
  • 빠른 조회가 필요하지 않을 때

  • 메리트로서는 이름 그대로, Dictionary의 리터럴로 쓸 수 있어 가독성이 오른다고 하는 것등입니까. 순서가 지정된 사전을 원할 때 고려해 보는 것은 어떻습니까?

    Twitter: @a_beco
    SoundCloud: @beco <- 작업용 배경 음악에 부디!

    좋은 웹페이지 즐겨찾기