[iOS] App Development

[iOS/Swifit] Dictionary 사용법

ddgoori 2021. 3. 8. 19:57

Dictionary

A collection whose elements are key-value pairs.

 

Creating and Populating Dictionaries

 

 

Dictionaries

Keys can be any type

Keys have no order

- key는 중복이 올 수 없음 - unique 여야함

- different keys는 같은 values를 가리킬 수 있다. 

(Different keys can point to the same value)

- all the keys / all the values 는 타입이 각기 타 같아야한다

 

Arrays

Indexes must be Ints

Indexes must be sequential

 

 

Dictionaries Examples

 

var emptyDictionary: [String: Int] = [:]
var namesAndPets = [
					"Ron" : "Rat",
                    "Rincewind" : "Luggage",
                    "Thor" : "Hammer",
                    "Goku" : "Flying Nimbus"]
                    
print(namesAndPets)

var emptyDictionary: [String: Int] = [:]
print(emptyDictionary)

var namesAndPerts = ["dahae" : "woododng",
                     "soovin" : "udong",
                     "Kiwoon" : "cookie"]

print(namesAndPerts)

namesAndPerts.updateValue("Mango🐶", forKey: "Chris")
print(namesAndPerts)

namesAndPerts["Calvin"] = "Tiger🐹"
print(namesAndPerts)

namesAndPerts.updateValue("Owl", forKey: "Ron")
print(namesAndPerts)

namesAndPerts["Ron"] = "OWL🦉"
print(namesAndPerts)

 

결과값

[:]
["dahae": "woododng", "Kiwoon": "cookie", "soovin": "udong"]
["Kiwoon": "cookie", "soovin": "udong", "Chris": "Mango🐶", "dahae": "woododng"]
["Kiwoon": "cookie", "soovin": "udong", "Chris": "Mango🐶", "Calvin": "Tiger🐹", "dahae": "woododng"]
["Kiwoon": "cookie", "soovin": "udong", "Chris": "Mango🐶", "Ron": "Owl", "Calvin": "Tiger🐹", "dahae": "woododng"]
["Kiwoon": "cookie", "soovin": "udong", "Chris": "Mango🐶", "Ron": "OWL🦉", "Calvin": "Tiger🐹", "dahae": "woododng"]

 

 

- 딕셔내리에 없는 것을 물어봣을 떄 array보다 더 유연하다. -> array는 항상 range of array를 알아야함

- key-value pair -> Tuple

 

 

 

How to access and iterate over dictionaries

 

- array랑 비슷하지만 index 대신 키를 사용하여 value에 접근한다.

- 없는 키값 ex "A"를 넣더라도 index out of range 에러를 뱉는 대신 nill을 리턴한다.

removeValue할 게 없으면 nil 을 반환한다.

 

 

For Loops

// for loops에서 key 혹은 value만 얻고 싶을땐 이렇게 사용하면된다. _ 언더스코어 이용하면 된다.

for(name, _) in namesAndPerts {
    print(name)
}

 

결과값

 

Kiwoon

dahae

Ron

Calvin

Chris

 

// dict = [key : value]
// dictionary에서 key 값만 이용하고싶을 때!
for name in namesAndPerts.keys {
    print(name)
}

 

결과값

 

Kiwoon

dahae

Ron

Calvin

Chris

 

 

for petName in namesAndPerts.values {
    print(petName)
}

결과값

 

 

 

Tiger🐹

Mango🐶

cookie

woododng

OWL🦉

 

 

Hashable

A Type that provides an integer hash value

정수 정수 해시값을 제공하는 타입

 

해시 Hash:

- 데이터의 효율적 관리를 목적으로 임의 길이의 데이터를 고정된 길이의 데이터로 매핑

- 매핑전 데이터 값을 key라 하고, 매핑 후의 데이터 값을 해시값이라고 함

- 전체적인 과정을 해싱이라고 한다.

 

해시충돌: 키 값이 달라도 같은 해시값이 나올 수 있음

- 해시 함수는 해시값의 개수보다 많은 키값을 해시값으로 변환해서 서로 다른 두개의 키값에 대해 동일한 해시값을 내는 경우

- 해시 테이블의 가장 큰 문제점. 이를 없애는 것은 힘들고 충돌을 최소화하는 것이 쟁점이다.

 

해시 충돌에도 불구하고 해시테이블을 사용하는 이유는?

- index(색인)에 해시값을 사용하여 모든 데이터를 살피지 않고 삽입/삭제가 가능

- 하드디스크나 클라우드에 존재하는 무한의 데이터들은 유한한 개수의 해시값으로 매핑하여 작은 크기의 캐쉬메모리로도 프로세스 관리가 가능하다. 

- 해시함수는 언제나 동일한 해시값 리턴 -> 해당 색인만 알면 해시테이블의 크기에 상관없이 데이터에 대단히 빠르게 접근한다. 

- 색인index는 계산이 가능한 간단한 함수로만 작동해서 효율적임. 데이터 액세스시 시간복잡도 O(1) - Constant Time 언제나 한 단계만 거침

 

Dictionary의 <KeyType, ValueType>

- 유일한 제약사항: KeyType은 해쉬가능한 타입이어야한다(Hashable)

- 그 자체로 유일하게 표현이 가능한 방법을 제공해야함

- 스위프트의 기본타입 String In Double등은 기본적으로 해쉬가 가능함 + 열거형 enum도 해쉬

- 그래서 Dictionary의 KeyType으로 사용할 수 있다.

 

Strings, integers, floating-point, Boolean values, sets이 기본적으로 Hash Value를 제공합니다.

(set은 Hashable한 것 만 들어갈 수 있어요)





본문 일부 출처: https://zeddios.tistory.com/498 [ZeddiOS]

 

'[iOS] App Development' 카테고리의 다른 글

[Swift/iOS] Functions and Return / Typealias / Compound Type  (0) 2021.03.09
Sets  (0) 2021.03.08
While Loops / For Loops / Iterating Collections / Nested Loops  (0) 2021.03.05
[0] Swift Fundamentals :  (0) 2021.02.16
[옵셔널]  (0) 2020.12.16