dev._.note

[Swift] Dictionary (사전형) 본문

Dev/SWIFT

[Swift] Dictionary (사전형)

Laena 2023. 11. 12. 19:22

👏 Dictionary(사전형)

Dictionary는 동일한 데이터 타입이 Key: Value 쌍으로 묶인 순서가 없는 컬렉션(Unordered Collection). 
Value는 실제로 담고 있는 값, Key는 해당 값의 이름표(식별자, Identifier)와 같은 역할. Key를 통해 Value를 가져옴.
Dictionary의 데이터 구조는 사전과 유사한 데이터 타입.
사전에서 찾는 단어가 Key 고 단어의 뜻이 Value.

참고로, Dictionary 의 Key 타입은 Hashable 프로토콜에 부합해야 함. Hashable 타입은 유일하게 표현 가능한 값을 제공하는 타입으로, 검색이 용이. 데이터 구조에 순서가 없기 때문에 hashable 한 타입이어야 원소를 빠르게 찾을 수 있기 때문. Swift의 모든 기본 타입(Int, Double... enumeration)은 Hashable 프로토콜을 따르기 때문에 기본 타입.

 


👏 Dictionary 초기화

  • 비어있는 딕셔너리 선언 방법
  • 초기화시 Key : Value 쌍을 주는 딕셔너리 선언 방법 
  • Swift에서 자료형을 작성하지 않아도 유추하여 지정되지만, 명시해 주는 것이 좋음
// 비어있는 딕셔너리 선언 방법
var dict1 = Dictionary<Int, String>()
var dict2 = [Int: String]()
var dict3: [Int: String] = [:]

// 초기화시 Key : Value 쌍을 주는 딕셔너리 선언 방법 
var dict4: [Int: String] = [1: "One", 2: "Two", 3: "Three"]
var dict5 = [1: "One", 2: "Two", 3: "Three"]

 


👏 Dictionary Key/Value 쌍 추가, 변경, 삭제

  • updateValue(_:forKey:)
    특정 키의 값을 추가하거나 변경할 수 있는 메소드. 기존에 존재하는 값을 반환.
  • removeValue(forKey:)
    특정 키의 값을 삭제할 수 있는 메소드. 기존에 존재하는 값을 반환.
  • 서브스크립트 문법
    dict[key] = value 형태의 문법을 통해서 특정 키의 값을 추가, 변경, 삭제할 수 있음.
dict4.updateValue("33333", forKey: 3)
// 키/값 변경 -> [3: "33333", 1: "One", 2: "Two"]

dict4.updateValue("Four", forKey: 4)
// 키/값 추가 -> [3: "33333", 1: "One", 2: "Two", 4: "Four"]

dict4.removeValue(forKey: 1)
// 키/값 삭제 -> [2: "Two", 3: "33333", 4: "Four"]

// 서브스크립트로 key 값을 지정
dict4[1] = "11111" // 추가
dict4[5] = "Five"  // 변경
dict4[2] = nil     // 삭제
// [5: "Five", 4: "Four", 1: "11111", 3: "33333"]

 


👏 Dictionary 에서 값 가져오기

서브스크립트 문법을 통해서 딕셔너리의 특정 키의 값을 가져올 수 있음. 반환 값은 Optional type 으로, 딕셔너리에 특정 키가 없는 경우 nil 이 반환. Optional binding 또는 Forced Unwrapping을 통해 Optional 이 아닌 특정 타입의 값을 가져올 수 있음.

 

  • Optional binding :: if let 구문을 통해 Optional 타입의 값이 있는지 확인한 후, 새로운 변수/상수에 대입하는 방식.
  • Forced Unwrapping ::! (exclamation mark)를 붙여 강제로 Optional 타입을 특정 타입으로 변환한다. 키가 반드시 있다는 것을 가정하므로 값이 nil 경우 런타임 에러가 발생.
// Optional binding
if let value = dict4[1] {
    print(value)
} else {
    print("Key not found")
}

// Forced Unwrapping
let value1 = dict4[1]! // "11111"
let value2 = dict4[2]! // error!

 


👏 Dictionary 에서 반복문을 통해 key, value 가져오기

  • for (key, value) in dict를 통해 key, value를 함께 반복할 수 있음.
  • for key in dict.keys 를 통해 key 만 반복할 수 있음.
  • for value in dict.values 를 통해 value 만 반복할 수 있음.
var myDict = [1: "One", 2: "Two", 3: "Three"]

for (key, value) in myDict {
    print(key, value)
}

for key in myDict.keys {
    print(key)
}

for value in myDict.values {
    print(value)
}

 


👏 Dictionary 정렬하기

기본적으로 Dictionary는 순서가 없는 컬렉션. sorted(by:) 메서드를 이용해 순서를 지정할 수 있음.

순서가 정렬된 Dictionary 가 아닌, Dictionary의 (key, value)를 Tuple 형태로 묶어, 정렬된 배열을 반환.

 

  • key 기준으로 정렬 시 sorted 함수에 {$0.0 < $1.0} 클로저를 전달.
    첫 번째 인수의 key 가 두 번째 인수의 key 보다 작으면 새로운 배열에 추가.
  • value 기준으로 정렬 시 sorted 함수에 {$0.1 < $1.1} 클로저를 전달.
    첫 번째 인수의 value 가 두 번째 인수의 value 보다 작으면 새로운 배열에 추가.
var scoreDict: [Int: Int] = [1: 90, 2: 50, 3: 30, 4: 100]
// key 값 기준으로 정렬
let keySortedDict = scoreDict.sorted(by: {$0.0 < $1.0}) 
print(keySortedDict)
// [(key: 1, value: 90), (key: 2, value: 50), (key: 3, value: 30), (key: 4, value: 100)]

// value 값 기준으로 정렬
let valueSortedDict = scoreDict.sorted(by: {$0.1 < $1.1}) 
print(valueSortedDict)
// [(key: 3, value: 30), (key: 2, value: 50), (key: 1, value: 90), (key: 4, value: 100)]

'Dev > SWIFT' 카테고리의 다른 글

[Swift] Optional(옵셔널)  (1) 2023.11.14
[Swift] IBAction과 IBOutlet  (1) 2023.11.13
[Swift] Set (집합)  (0) 2023.11.10
[Swift] Enum(열거형)  (0) 2023.11.07
[Swift] for문과 while문  (0) 2023.11.06