1. 딕셔너리 (Dictionary)
딕셔너리(Dictionary)는 집합과 동일하게 순서를 갖지 않는 콜렉션이다. 이는 키(key), 값(value) 쌍으로 이뤄지고 딕셔너리 내에 키 값은 고유하다.
1-1. 딕셔너리 선언(생성)
- var myDict1 = [타입: 타입]( )
- var myDict2 = [key1: value1, key2: value2, key3: value3...]
- var myDict3: Dictionary<타입, 타입> = [:]
- var myDict4: [타입: 타입] = [:]
- var myDict5 = Dictionary<타입, 타입>( )
let myDict1 = [String: String]()
let myDict2 = ["name": "Semin", "location": "Won-Ju"]
let myDict3: Dictionary<String, Bool> = [:]
let myDict4: [String: Int] = [:]
let myDict5 = Dictionary<String, Character>()
print(type(of: myDict1), myDict1) // Dictionary<String, String> [:]
print(type(of: myDict2), myDict2) // Dictionary<String, String> ["name": "Semin", "location": "Won-Ju"]
print(type(of: myDict3), myDict3) // Dictionary<String, Bool> [:]
print(type(of: myDict4), myDict4) // Dictionary<String, Int> [:]
print(type(of: myDict5), myDict5) // Dictionary<String, Character> [:]
위 방법을 사용하여 딕셔너리를 선언할 수 있다. 이중 myDict1, myDict2를 선언하는 방법이 제일 많이 사용된다. 비어있는 배열, 집합은 []를 사용하여 나타냈지만 비어있는 딕셔너리는 [:]를 사용하여 나타낼 수 있다.
1-2. count
배열, 집합과 동일하게 요소의 개수를 반환한다.
let myDict1 = [String: Int]()
let myDict2 = ["age": 25, "height": 175]
print(myDict1, myDict1.count) // [:] 0
print(myDict2, myDict2.count) // ["age": 25, "height": 175] 2
1-3. isEmpty
이것도 배열, 집합과 마찬가지로 딕셔너리가 비어있으면 true, 그렇지 않으면 false를 반환한다.
let myDict1 = [String: Int]()
let myDict2 = ["age": 25, "height": 175]
print(myDict1.isEmpty) // true
print(myDict2.isEmpty) // false
1-4. 요소 추가 및 수정
1-4-1. 키 값을 사용하여 추가 및 수정
- 딕셔너리[key] = value
위 형태를 사용하여 딕셔너리에 값을 추가할 수 있다. 만약 이미 존재하는 키 값이라면 기존의 value 값이 새로운 값으로 갱신된다.
var myDict = ["age": 25, "height": 175]
myDict["weight"] = 75 // 새로운 값 추가
print(myDict) // ["age": 25, "height": 175, "weight": 75]
myDict["age"] = 26 // 기존 값 갱신
print(myDict) // ["age": 26, "height": 175, "weight": 75]
1-4-2. updateValue(_, forKey: ) 메서드를 사용하여 추가 및 수정
- 딕셔너리.updateValue(value, forKey: key)
updateValue 메서드는 딕셔너리에 기존 키값이 존재하면 그에 대응되는 값을 수정하고, 존재하지 않다면 새로운 값을 추가한다. value는 추가할 값을 뜻하고 key는 키값을 뜻한다. 또한 이 메서드는 수정 전의 값을 반환하는데 만약 키가 존재하지 않아 새로운 값이 추가되는 경우에는 nil 값이 반환된다. 이처럼 nil 값이 반환될 수 있으므로 이는 Optional 타입의 값을 반환한다.
var myDict = ["age": 25, "height": 175]
print(myDict.updateValue(75, forKey: "weight")) // nil
print(myDict) // ["age": 25, "height": 175, "weight": 75
print()
print(myDict.updateValue(26, forKey: "age")) // Optional(25)
print(myDict) // ["age": 26, "height": 175, "weight": 75
1-5. 요소 삭제
1-5-1. removeValue(forKey: ) 메서드를 사용하여 삭제
removeValue 메서드도 updateValue 메서드와 동일하게 키에 대응되는 값이 존재하면 삭제를 하고 삭제한 값을 Optional 타입으로 반환하고, 존재하지 않는다면 nil 값을 반환한다.
var myDict = ["age": 25, "height": 175]
print(myDict.removeValue(forKey: "age")) // Optional(25)
print(myDict) // ["height": 175]
print(myDict.removeValue(forKey: "age")) // nil
print(myDict) // ["height": 175]
1-5-2. nil 값을 사용하여 삭제
특정 key에 대응되는 값에 nil을 저장하면 해당 값이 삭제된다.
var myDict = ["age": 25, "height": 175]
myDict["height"] = nil // "height": 175 삭제
print(myDict) // ["age": 25]
1-5-3. removeAll() 메서드를 사용하여 삭제
이 메서드를 사용하면 딕셔너리 요소 전체를 삭제할 수 있다.
var myDict = ["age": 25, "height": 175]
myDict.removeAll()
print(myDict) // [:]
1-5-4. [:]를 사용하여 빈 딕셔너리로 초기화
앞서 빈 딕셔너리는 [:] 형태로 나타낸다 하였는데 이를 사용하면 기존 딕셔너리를 빈 딕셔너리로 초기화할 수 있다.
var myDict = ["age": 25, "height": 175]
myDict = [:]
print(myDict) // [:]
1-6. for ~ in
배열(Array), 집합(Set)과 동일하게 딕셔너리도 for ~ in 반복문을 사용하여 요소 전체에 접근할 수 있다. 이때 반복 변수는 (key, value) 형태의 튜플로 사용해야 한다.
var myDict = ["age": 25, "height": 175, "weight": 75]
for (key, value) in myDict {
print(key, value)
}
/*
age 25
height 175
weight 75
*/
1-7. keys
keys 속성을 사용하면 딕셔너리의 전체 키 값에 대해서만 접근할 수 있다.
var myDict = ["age": 25, "height": 175, "weight": 75]
print(myDict.keys) // ["age", "height", "weight"]
for k in myDict.keys {
print(k)
}
/*
age
height
weight
*/
1-8. values
values 속성을 사용하면 키 값에 대응되는 값에 대해서만 접근할 수 있다.
var myDict = ["age": 25, "height": 175, "weight": 75]
print(myDict.values) // [25, 175, 75]
for v in myDict.values {
print(v)
}
/*
25
175
75
*/
딕셔너리(Dictionary) 역시 Python에서 자주 사용했던 것인데 Swift에도 존재하니 반갑다.
키-값 구조는 JSON 등 정말 자주 사용되는 형식이므로 내용을 잘 기억해두어야겠다.
끝!