적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Algorithm/참고

[Swift iOS] Dictionary 사용법 + dictionaries inside array

hongssup_ 2021. 9. 10. 14:23
반응형

딕셔너리의 기본 속성

key : value 함께 저장되는 자료구조

정렬되지 않은 컬렉션

값은 중복 가능, 키는 중복되면 안된다. 

 

1. 딕셔너리 생성

var dict1: [String:Any] = [:]		//빈 딕셔너리 생성
var dict2: [String:Any] = ["name":"hongssup", "age":20]		
var dict3 = Dictionary<String, Any>()		//생성자로 생성
var dict4 = [String:Any]()

value 값에는 타입을 Any로 설정해주면 String, Int 아무거나 올 수 있지만 

key 값은 타입을 지정해주어야 한다.

key 값을 Any 로 설정해주면 다음과 같은 경고가 뜬다. Any는 Hashable 프로토콜을 준수하지 않아 key 값으로 사용 불가하다눈.. 

Type 'Any' does not conform to protocol 'Hashable'

 

2. 딕셔너리 접근

var dict:[String:Any] = ["name":"hongssup", "age":20]
//value 가져오기
let name = dict["name"]		//"hongssup"
//getting all values
dict.values			  //["hongssup", 20]
dict.values.sorted()  	//정렬
//getting all keys
dict.keys			  //["age", "name"]
dict.keys.sorted()	  //정렬
for key in dict.keys { print(key) }
//all key, value
for (key, value) in dict { print("\(key), \(value)") }

 

3. 딕셔너리 추가

dict["height"] = 170
dict.updateValue(170, forKey: "height")

 

4. 딕셔너리 삭제 

dict["height"] = nil
dict.removeValue(forKey: "height")
//전체삭제
dict.removeAll()

 

5. 딕셔너리 갯수 확인

dict.count		//딕셔너리 갯수 확인 (Int)
dict.isEmpty		//딕셔너리 비었는지 확인 (Bool)

 

6. 배열 안에 딕셔너리 넣기

이 글을 쓰게 된 이유가 이거 때문이다. 

배열 안에 딕셔너리를 넣으려고 하는데 계속 에러가 나서 찾아보니 따로 방법이 있더라. 

다음과 같이 선언해주면 딕셔너리를 인자로 받을 수 있는 빈 배열을 생성할 수 있다. 

var list:Array = [Dictionary<String, Any>]()
var list:Array = [[String:Any]]()

참고 : StackOverflow

 

딕셔너리 요소 검색하기

 

딕셔너리 정렬하기

기본적으로 dictionary는 순서가 없는 컬렉션이지만 sorted(by:) 메소드를 이용해 순서를 지정할 수 있다. 

딕셔너리의 (key, value)를 tuple 형태로 묶어 정렬된 배열을 반환한다. 

- key 기준으로 정렬시 sorted 함수에 {$0.0 < $1.0} 클로저를 전달

- value 기준으로 정렬시 sorted 함수에 {$0.1 < $1.1} 클로저를 전달

var scoreDict: [Int: Int] = [1: 90, 2: 50, 3: 30, 4: 100]
// key 값 기준으로 정렬
let keySortedDict = scoreDict.sorted(by: {$0.0 < $1.0}) 
print(keySortedDict)
// [(key: 1, value: 90), (key: 2, value: 50), (key: 3, value: 30), (key: 4, value: 100)]

// value 값 기준으로 정렬
let valueSortedDict = scoreDict.sorted(by: {$0.1 < $1.1}) 
print(valueSortedDict)
// [(key: 3, value: 30), (key: 2, value: 50), (key: 1, value: 90), (key: 4, value: 100)]

 

7. 딕셔너리 value 수정

문제들을 풀다 보면 이미 key, value 가 있으면 value + 1을 해주고, 없으면 초기화를 먼저 시켜줘야 하는 경우가 많다. 

그럴 때, dict[key] != nil 이면 1을 더해주고, 아니면 1로 초기화 해주는 코드로 작성해줘도 되지만, 

다음과 같이 더 간단하게 한 줄로 구현이 가능하다. 

dict[num, default: 0] += 1

 

 


참고 : 소들이_Swift Dictionary

728x90
반응형

'Algorithm > 참고' 카테고리의 다른 글

[Swift] 2진수 변환 radix  (0) 2022.02.09
[Swift] reversed()  (1) 2022.01.16
[Swift] String 문자열 다루기  (2) 2022.01.10
[Swift] Array 배열 관련 함수들  (0) 2022.01.06
Swift 정규식 NSRegularExpression  (0) 2022.01.04