배열은 해쉬 테이블의 일종이다
"A dictionary is a type of hash table"
즉 딕셔너리는 해쉬테이블 처럼 키와 밸류를 갖는 타입이라는 것이다.
딕셔너리는 키를 통해서 접근이 가능하다.
(전체출력은 키없어도 되긴함..)
//타입을 지정하지 않고 데이터를 삽입해서 만든 딕셔너리
let dict01 = [
1:"minsoo",
2:"gosoo",
3:"jinsoo"]
//타입을 지정한 빈 딕셔너리
let dict02:[Int:String] = [:]
//밸류값에 배열을 넣는것도 가능
let dict03:[String:[String]] = [
"vip":["minsu", "gosoo"],
"blackList":["jinsoo", "eunsoo"] ]
다음과 같이 딕셔너리를 사용할 수 있다.
딕셔너리에서 접근은 키값을 통해서만 접근이 가능하다,
딕셔너리는 순서를 갖지 않기에 인덱스값으로 접근이 불가능하다.
(그래서 딕셔너리를 출력하면 그때마다 다른 순서로 출력된다.)
그렇다면 출력은 어떻게 해야 될까?
print(dict01)
출력값: [3: "jinsoo", 2: "gosoo", 1: "minsoo"]
print(dict01[1])
출력: Optional("minsu")
딕셔너리는 키값이 존재하지 않는 경우에도 오류는 내지 않는다.
존재하지 않는 키를 입력해서 접근하면 nil을 반환한다.
for (num, name) in dict01 {
print("member '\(name)' number is '\(num)'.")
}
member 'gosoo' number is '2'.
member 'minsoo' number is '1'.
member 'jinsoo' number is '3'.
for key in dict01.keys {
print(key)
}
<결과>
1
2
3
for val in dict01.values {
print(val)
}
<결과>
minsoo
jinsoo
gosoo
for문을 사용하면
이 경우 옵셔널에 신경써서 접근해야 한다.
for i in 1...3 {
if let value = dict01[i] {
print("Key: \(i), Value: \(value)")
} else {
print("Key: \(i) does not exist in the dictionary")
}
}
1...3 범위 지정이 애매하다면 키값만 존재하는 배열을 만들어서 접근하는것도 하나의 방법이 되겠다.
let keyArr:[Int] = [1,2,3]
for i in keyArr{
if let value = dict01[i] {
print("Key: \(i), Value: \(value)")
} else {
print("Key: \(i) does not exist in the dictionary")
}
}
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]]
for key in interestingNumbers.keys {
interestingNumbers[key]?.sort(by: >)
}
다음과 같이 정렬이 가능하다.