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 |