본문 바로가기
iOS Swift/문법

[Swift] Dictionary

by 야고이 2024. 3. 15.
728x90

240315

Dictionary 특징

  1. 키와 값을 하나의 요소로 저장한다
  2. 정렬되지 않는 컬렉션
  3. 키와 값의 타입이 모두 같아야함
정식문법
Dictionary<k,v>
콤마사용!
단축문법
[k:v]
콜론사용
let dict1: Dictionary<String, Int>
let dict2: [String: Int]

 

 

요소 만들기

var dict = ["A": "Apple", "B": "Banana"]

 

초기화(빈 딕셔너리 만들기)

dict = [:] //빈배열을 저장하거나
dict = [String: String]() //생성자를 사용해도 됨
dict = Dictionary<String, String>() //정식문법으로 작성한 코드

 

요소 갯수 확인과 비어있는지 확인

let words = ["A": "Apple", "B": "Banana", "C": "City"]
words.count //갯수 확인. 배열이랑 똑같쥬
words.isEmpty // 비어있는지 확인. 이것도 배열이랑 같음 겹치는 메소드가 많음

배열이랑 같은 메소드가 많다


Accessing Keys and Values

항상 키를 사용해서 값을 가져온다

let words = ["A": "Apple", "B": "Banana", "C": "City"]

words["A"] //Apple
words["Apple"] //nil 무조건 키의 값만 넣을 수 있음

let a = words["E"]
let b = words["E", default: "Empty"] //E 키가 없을 때 기본값 Empty 를 리턴해준다

a //옵셔널 스트링
b // 넌옵셔널 스트링

 

딕셔너리 특징 중에 정렬되지 않는다고 했다 

아래 코드로 확인 가능하다

새로 불러올 때마다 순서가 달라지는걸 볼 수 있다

for k in words.keys {
    print(k) //정렬 되지 않아서 순서가 계속 바뀜
}

for v in words.values {
    print(v)
}

 

동일한 순서로 처리하고 싶다면 sorted 사용 하면된다

for k in words.keys.sorted() {
    print(k)
}

 

Array()
두 속성이 리턴하는 값을 배열로 받고 싶다면 .
근데 역시나 순서 고정 안됨. 왜냐 딕셔너리는 정렬되지 않으니까
let keys = Array(words.keys)
let values = Array(words.values)

새로운 요소 추가 Adding Keys and Values

위에서 값에 접근 할 때는 key를 사용한다고 했다. 새로운 요소를 추가할 때도 key를 사용한다.

//예제코드

var mutableDict = [String: String]()

//값저장하기
mutableDict["A"] = "Apple"
mutableDict["B"] = "Banana"

 

서브스크립트 문법으로 새로운 값 저장
//B 키에 새로운 값 저장
mutableDict["B"] = "Ball"
mutableDict.count //2 여전히 카운트 똑같음

**알아두기
Upsert: Ipdate + Insert
키가 없었다면 새로 저장하고, 키가 존재 한다면 기존에 연결되어 있던 값을 새로운 값으로 바꾼다 

 

 

.updateValue
메소드로 새로운 값 저장
mutableDict.updateValue("City", forKey: "C")
mutableDict

없었던 값은 새로 저장 되고
이미 있던 키는 새로운 값으로 바뀐다


Removing Key and Values 삭제

서브스턴스 문법으로 삭제

가장 쉬운 방법은 nil 을 저장하는 것

메소드로 삭제 
removeValue(forkey: )
삭제할 값이 있으면 삭제한걸 리턴하고, 값이 없으면 nil 리턴. 리턴값을 통해서 실제로 삭제 했는지 확인 할 수 있음
mutableDict.removeValue(forKey: "A") //삭제한 값 리턴 Apple

 


Comparing Dictionaries 비교

let first = ["A": "Apple", "B": "Banana", "C": "City"]
let second = ["A": "Apple", "C": "City", "B": "Banana"]

first == second //true
first != second //false

 

기타 등등등

사실 아래 코드는 find(클로저) 를 이해 못해서 이해 안감 ㅋㅋ

이해해서 다시 돌아올게,,,

let find: ((key: String, value: String)) -> Bool = {
    $0.key == "B" || $0.value.contains("i") //키에 B가 있거나,값에 i 가 포함되어 있으면 true 를 리턴하는 코드
}
first.contains(where: find) //true


first.first(where: find) //항상 같은 결과가 나오지 않음. 정렬되어 있지 않기 때문에


first.filter(find) //검색된 모든 요소를 새로운 딕셔너리로 보여줌

728x90

댓글