본문 바로가기
Swift랑 친해지기/Swift 책보면서 정리해보기

[집단 자료형] 딕셔너리에 동적으로 아이템 추가하기 (Swift)

by 데브킹덕 2022. 1. 29.

배열은 아이템을 추가할때 잘못된 인덱스 참조 오류를 피하려고

배열의 크기를 자동으로 확장하는 메소드만 사용했지만, (append, insert 등)

딕셔너리에는 메소드를 사용해서 추가하는 방법뿐만 아니라 ,

직접 새로운 키와 값을 대입하여 아이템을 추가할 수 있음!!

 

동적으로 아이템 추가

var newCapital = [String : String]()
newCaptial["JP"] = "Tokyo"

딕셔너리 변수 뒤에 []를 붙이고, 괄호 안에 사용할 String 타입을 작성한 후

대입 연산자로 원하는 값을 할당하면 됨

"JP" => "Tokyo" 로 이루어진 키-값 쌍의 아이템 하나가 저장됨

 

딕셔너리에 저장된 튜플의 개수로 딕셔너리의 크기를 결정함 

아이템이 저장되어 있는지 isEmpty속성을 통해 확인 가능

true면 비어 있는 것이고 false면 아이템이 있는거임 

 

 

updateValue(_:forKey:)

딕셔너리에 값을 할당하는데 사용

 

이 메소드는 키가 있는지에 따라 수행하는 역할이 달라짐

 

🔥 기존에 키가 있으면 - 연결된 값을 수정하는 역할- 저장된 값을 수정하면 수정하기 이전의 값이 결과값으로 반환됨 🔥

 

🔥 새로운 키가 입력되면 - 아이템을 추가하는 역할 수행- 기존에 저장되어 있는 값이 없으므로 nil을 반환 🔥

<딕셔너리 객체>.updateValue(<저장할 데이터>,forKey:<데이터를 참조 및 저장하는데 사용할 키>)

딕셔너리 변수 capital에 각각 "KR", "EN", "JP" 이라는 고유 키로 연결되는 "London", "Seoul", "Sapporo" 값을 업데이트 해봤음

첫번째 업데이트 구문에서는 "KR"이라는 키로 값을 업데이트하는데, 

capital변수에 정의 되지 않은 키로 값이 새롭게 추가되는 거잖슴??

두번째 "EN"도 마찬가지임 업데이트 이전의 값을 반환하는 updateValue 메소드 특성상 이전에 저장된 값이 없다는 의미로 nil을 반환함 

세번째  업데이트 메소드 "JP라는 키로 저장하는데 이미 사용했던 키임

그러면 값이 업데이트가 되버림 그결과롤 지전에 저장되어 있던 "Tokyo"가 반환이 됨

 

딕셔너리에 저장된 아이템을 제거할때 방법 두가지 있음

1. 키에 연결된 값에 직접 nil을 할당하는 방법

2. 명시적으로 removeValue(forKey:)메소드를 사용하는 방법

 

배열은 인덱스를 직접 참조하기 위해서 인덱스가 미리 만들어져 있어야 하는데,

딕셔너리는 키 자체가 일련의 순서를 가지고 있지 않음 (해시 연산에 의한 결과값 역시 연속되는 값은 아님)

 

실제로 어떤 데이터가 키로 사용될지 미리 알 수 없으므로 기존에 사용된 적이 없던 새로운 키가 입력되면 이 키와 값을

저장하기 위한 튜플을 하나 만들어 저장하면 될뿐임. 새로운 인덱스 공간을 확보하고 크기를 늘릴 필요가 없고 

딕셔너리 변수가 초기화 되어 있기만 하면됨

 딕셔너리는 고유 키에 대한 제약이 덜하다 보니 프로그램이 딕셔너리로부터 키를 호출해서 저장된 값을 불러올 때 없는 키를 

호출했을 가능성을 염두해 두어야함.

스위프트에서는 딕셔너리로부터 키를 호출해서 저장된 값을 불러올때, 업데이트 메소드를 실행한 결과를 반환할 때,

오류가 발생할 가능성을 염두에 둔 다음 다음과 같은 특별한 형식으로 값을 반환함 

Optional("Seoul")

옵셔널(Optional)

다양한 객체지향 프로그래밍에서 오류 처리를 위해 애용되는 에러 캐치를 대신할 목적으로 도입한 개념임

 

옵셔널은 나중에 제대로 공부해 보도록하자!