Swift 딕셔너리
Swift 의 딕셔너리는 자바나 일반 자료구조의 HashTable 과 동일한 개념이다. key 와 value 로 이루어져 있고, 데이터엔 순서가 없다.
Hash Table 에 대해서도 포스팅을 해놓은 자료가 있으니 Hash Table 이 뭔지 잘 모르면 보고 오면 좋겠다.
Hash 자료구조 - java
Hash 자료구조란? key와 Value 가 쌍을 이루는 자료구조 key 탐색의 시간복잡도가 O(1) 이다. key 삭제의 시간복잡도가 O(1) 이다. key와 Value 삽입의 시간복잡도가 O(1) 이다. Hash 자료구조의 경우 검색과
forstudy.tistory.com
Dictionary 란?
Key - Value 쌍으로 이루어진 Collection 을 의미한다.
Dictionary 의 시간 복잡도
Hash Table 과 동일한 역할을 하고, 시간 복잡도는 마찬가지로 삽입,삭제,검색의 경우 O(1) 이다.
Dictionary 사용하기
Swift Dictionary 의 경우, Java 와는 다르게 Key 의 타입으로 String, Int, Double, Bool 타입만 가질 수 있다. Dictionary 는 다음과 같이 선언할 수 있다.
var 변수명 : [키 타입: 값 타입] = [키1:값1, 키2:값2...]
변수를 선언할 때 타입을 직접 지정해줄 수 있지만, 타입 추론을 이용하여 컴파일러가 자동으로 식별하게 할 수도 있다.
var 변수명 = [키:값, 키:값 ....]
다음 코드는 사람 이름과 그에 해당하는 전화번호 문자열의 형태로 세 개의 키-값 쌍으로 초기화된 변수에 할당된 새로운 딕셔너리를 생성한다.
var phoneBook : [String : String] =
["jong ho": "010-1234-5678",
"uk dong" : "010-1234-5612",
"yh" : "010-8876-6666"]
위에서 언급한 것처럼 변수 타입을 선언하지 않더라도, 컴파일러가 알아서 타입을 추론할 수 있다.
var phoneBook =
["jong ho": "010-1234-5678",
"uk dong" : "010-1234-5612",
"yh" : "010-8876-6666"]
시퀀스 기반의 딕셔너리 초기화
딕셔너리는 키와 값을 나타내는 시퀀스를 이용하여 초기화할 수도 있다. 키와 값의 시퀀스를 zip 함수에 전달하면 되는데, 다음의 예제는 두 개의 배열을 이용하여 딕셔너리를 생성한다.
var userName = ["jong ho","uk dong","yh"]
var phoneNumber = ["010-1234-5678","010-1234-5678","010-9876-6532"]
var phoneBook = Dictionary(uniqueKeysWithValues: zip(userName, phoneNumber))
phoneBook.forEach{ userName, phoneNumber in
print(userName + " " + phoneNumber)
}
userName 과 phoneNumber 배열을 이용해 새로운 딕셔너리를 생성했다.
딕셔너리 항목 접근과 갱신
phoneBook["jong ho"] = "010-9999-8888"
키 값을 사용해 값을 참조하거나, 값을 갱신할 수 있다. 만약 해당 키가 존재하지 않는다면, 자동으로 추가된다.
var userName = ["jong ho","uk dong","yh"]
var phoneNumber = ["010-1234-5678","010-1234-5678","010-9876-6532"]
var phoneBook = Dictionary(uniqueKeysWithValues: zip(userName, phoneNumber))
phoneBook["jong ho"] = "010-9999-8888"
phoneBook["anonymous"] = "010-1111-1111"
phoneBook.forEach{ userName, phoneNumber in
print(userName + " " + phoneNumber)
}
//출력 결과
uk dong 010-1234-5678
yh 010-9876-6532
anonymous 010-1111-1111
jong ho 010-9999-8888
역시 순서가 없는 자료구조이기 때문에, 추가한 순서와는 상관없이 출력되는 것을 확인할 수 있다.
딕셔너리 반복
딕셔너리는 for in 문 혹은 for each 문을 사용해서 요소들을 반복해서 접근할 수 있다. for in 문을 사용할 경우, (키,값) 튜플을 통해 딕셔너리의 키, 값에 접근할 수 있다.
for (name,phoneNumber) in phoneBook {
print("\(name) \(phoneNumber)")
}
//결과출력
jong ho 010-9999-8888
anonymous 010-1111-1111
yh 010-9876-6532
uk dong 010-1234-5678
for each 문을 사용하면, 키와 값의 타입을 람다 변수로 사용하는 클로저를 사용해 각 요소에 접근할 수 있다.
phoneBook.forEach { name, phoneNumber in
print("\(name) \(phoneNumber)")
}