Dictionary
키-값 쌍으로 저장되는 collection.
키로 접근하면 값을 확인할 수 있다. 키로는 string이나 number 같이 hashable인 값들을 사용할 수 있다.
형태
var responseMessages = [200: "OK",
403: "Access forbidden",
404: "File not found",
500: "Internal server error"]
var interestingNumbers = ["primes": [2, 3, 5, 7, 11, 13, 17],
"triangular": [1, 3, 6, 10, 15, 21, 28],
"hexagonal": [1, 6, 15, 28, 45, 66, 91]]
위와 같이 키: 값을 [] 안에 나열하면 된다. 값으로는 배열도 넣을 수 있다.
생성
생성하는 방법은 여러 가지가 있는데, 실제로는 1과 2를 가장 많이 썼던 것 같다.
사용
1. 값 접근하기
값 접근은 간단하다. 원하는 key 값을 알고 있다면 dictionary[key]로 가져올 수 있다.
위에서 예로 들었던 interestingNumbers에서 primes에 대한 값을 가져와 보자.
옵셔널로 반환되지만 primes에 매칭 되어있던 값들이 정상적으로 출력되는 것을 확인할 수 있다.
2. 값 추가하기
추가도 간단하다. dictionary[key] = value를 사용할 수 있다.
var interestingNumbers = ["primes": [2, 3, 5, 7, 11, 13, 17],
"triangular": [1, 3, 6, 10, 15, 21, 28],
"hexagonal": [1, 6, 15, 28, 45, 66, 91]]
interestingNumbers["random"] = [2, 5, 6, 9]
print(interestingNumbers)
출력해보니 random이라는 key에 원하는 값으로 배열이 잘 들어간 것을 확인할 수 있다. 그리고 dictionary는 순서가 보장되지 않는다는 사실도 알 수 있다..!
값을 추가하는 것은 updateValue를 사용할 수도 있다.
updateValue를 사용한 뒤에 interestingNumbers를 다시 찍어보면 random의 값이 [1]로 변경된 것을 확인할 수 있다.
3. 값 제거하기
var interestingNumbers = ["primes": [2, 3, 5, 7, 11, 13, 17],
"triangular": [1, 3, 6, 10, 15, 21, 28],
"hexagonal": [1, 6, 15, 28, 45, 66, 91]]
interestingNumbers["random"] = [2, 5, 6, 9]
interestingNumbers.removeValue(forKey: "random")
print(interestingNumbers)
interestingNumbers["primes"] = nil
print(interestingNumbers)
interestingNumbers.removeAll()
print(interestingNumbers)
제거는 원하는 키에 대한 값만 제거하는 removeValue와 모든 키와 값을 제거하는 removeAll을 사용한다.
궁금해서 nil로 지정하는 코드를 적어보았는데, 이것도 key와 value가 모두 제거되었다. value가 optional이 아니기 때문에 그런 것 같아서 이 방법보다는 removeValue를 사용하는 게 더 좋을 것 같다. (개발하다 보니까 애플 공식 문서를 따르는 방법이 제일 좋음..)
그리고 removeAt 메서드가 보여서 써봤는데, 딕셔너리에 있는 키- 값을 삭제하면서 해당 키-값을 리턴해주는 메서드였다.
사용해보니 아래와 같았다.
결과를 확인하기 위해 강제 언래핑을 사용하기는 했는데, print로 찍어보니 interestingNumbers에서는 제거되고 randomValues에는 key와 value가 저장되었다.
4. Dictionary 반복문
for-each 문을 활용하면 dictionary의 key-value를 모두 가져올 수 있다. 딕셔너리기 때문에 for (key, value) in dictionary로 사용해야 한다.
5. Dictionary merge
Dictionary와 Dictionary를 합치는 것도 가능하다. merge와 merging을 사용해보자.
- merge declaration
mutating func merge(_ other: [Key : Value],
uniquingKeysWith combine: (Value, Value) throws -> Value) rethrows
첫 번째로 merge를 하면서 중복되는 경우 기존 dict의 값을 살리는 방향으로 코드를 적었다. banana가 남아있는 것을 확인할 수 있다. 그럼 반대로 merge 되는 dict의 값을 살리는 것도 가능하다.
요렇게 하면 brother가 살아난다!
merging도 한 번 보자.
- merging declaration
func merging(_ other: [Key : Value],
uniquingKeysWith combine: (Value, Value) throws -> Value) rethrows -> [Key : Value]
merge와 다른 점은 새로운 Dictionary를 만든다는 것이다. 사용해보면 다음과 같다.
새로 들어오는 값을 남길지, 기존의 값을 남길지 결정하는 건 merge와 동일하다. 대신 새로운 Dictionary가 하나 생성되는 걸 확인할 수 있다. merging을 쓰니까 merge에서 사용하는 것처럼 dict를 var로 변경하지 않아도 되어서 좋다.
'Swift' 카테고리의 다른 글
Strings and Characters (0) | 2023.02.03 |
---|---|
[iOS] Structures and Classes 알아보기 (0) | 2022.06.29 |
[iOS] Swift Deinitialization 알아보기 (0) | 2021.09.27 |
[iOS] Swift initialization 알아보기 (4) - Failable Init (0) | 2021.09.24 |
[iOS] Swift initialization 알아보기 (3) - Designated Init, Convenience Init (0) | 2021.09.17 |