딕셔너리는 같은 타입의 키를 통해 같은 타입의 값을 저장하는 컬렉션으로 정해진 순서가 없이 저장된다. 이때 각 값은 유니크한 키를 통해 조회할 수 있다.
딕셔너리 선언은 Dictionary<Key, Value>
가 정식 선언이지만 [Key: Value]
단축어로도 가능하다.
var dict_int_str :[Int : String] = [:]
를 통해 빈 딕셔너리를 선언할 수 있다. [Int : String]
이라는 정보를 직접적으로 줄 필요 없이 문맥을 통해 추론할 수 있다면, 다시 그 타입의 빈 배열로 선언할 수 있다.
dict_int_str[1] = "One"
// 1 : One
dict_int_str = [:]
// empty dict
[키:값]
쌍을 통해 딕셔너리에 리터럴로 값을 넘겨줄 수 있다.
var dict_int_str: [Int : String] = [1:"One", 2:"Two", 3:"Three"]
딕셔너리를 선언할 때 값을 추론할 수 있다면 [Int : String]
과 같이 직접적인 정보를 줄 필요 없다. 키와 값은 각각 같은 타입의 데이터이기 때문이다.
딕셔너리 메소드와 프로퍼티, 서브스크립트 문법을 통해 딕셔너리 값 조회 및 수정이 가능하다.
Dictionary.count
프로퍼티는 아이템의 개수를 반환한다.
Dictionary.isEmpty
프로퍼티는 count
프로퍼티가 0과 같은지, 즉 아이템이 없는지 확인한다. 비었다면 True
, 아이템이 있다면 False
를 return.
서브스크립트를 통해 새로운 키를 선언, 딕셔너리에 값을 추가할 수 있다.
dict_int_str[4] = "four"
// dict_int_str: [1:"One", 2:"Two", 3:"Three", 4:"four"]
dict_int_str[4] = "Four"
// dict_int_str: [1:"One", 2:"Two", 3:"Three", 4:"Four"]
Dictionary.updateValue(_:forKey:)
메소드는 서브스크립트 문법 대신 딕셔너리 내부에 값을 넣거나 수정할 수 있다. 서브스크립트 문법과 달리 업데이트하기 전 키에 해당하는 값을 반환하기 때문에 주의해야 한다.if let old_val = dict_int_str.updateValue("one", forKey:1){
print("\(old_val)")
}
// One printed
// dict_int_str: [1:"one", 2:"Two", 3:"Three", 4:"Four"]
서브스크립트 문법을 활용해 Dictionary.updateValue
와 같은 기능을 구현해보자.
if let let old_val = dict_int_str[1]{
print("\(old_val)")
// one printed
} else {
print("this int is not stored")
}
dict_int_str[1] = "One"
// dict_int_str: [1:"One", 2:"Two", 3:"Three", 4:"Four"]
딕셔너리 키는 값이 없을 수 있기 때문에 옵셔널이 반환된다. if let =
으로 옵셔널을 받고 값을 확인하자.
nil
을 주면 곧 키에 해당하는 값을 삭제하는 기능이다.dict_int_str[4] = nil
// dict_int_str: [1:"One", 2:"Two", 3:"Three"]
Dictionary.removeValue(forKey:)
메소드를 통해 값이 있다면 반환한 후 삭제, 없다면 nil
을 반환한 후 삭제한다.if let old_val = dict_int_str.removeValue(forKey:3){
print("\(old_val)")
} else {
print(this int is not stored"
}
// Three printed
// dict_int_str: [1:"One", 2:"Two"]
for-in
루트문을 통해 키-값 쌍을 사용하자. 딕셔너리의 아이템은 (key, value)
튜플 형태로 반환되기 때문에, 언패킹한 후 반복문에 사용할 임시 상수/변수로 사용하자.
for (int_key, str_val) in dict_int_str {
print("\(int_key): \(str_val)")
}
// 1: One
// 2: Two
Dictionary.keys
또는 Dictionary.values
프로퍼티를 통해 따로 접근할 수도 있다. 이를 활용해 키 또는 값만 따로 배열로 만들 수도 있다.
let int_keys = [Int](dict_int_str.keys)
// int_keys: [1, 2]
let str_vals = [String](dict_int_str.values)
// str_vals: ["One", "Two"]
키 또는 값을 정렬해 사용할 때에는 프로퍼티에
sorted()
메소드를 적용하자.