애플사이다의 iOS 개발 일지

[Dictionary] value에 nil을 저장하려면? - nil의 타입을 명시 본문

Swift/Swift 문법

[Dictionary] value에 nil을 저장하려면? - nil의 타입을 명시

Applecider 2022. 7. 18. 16:10

Dictionary의 value 타입을 옵셔널로 지정하고, value에 nil을 할당하려면 어떻게 해야 할까?

궁금해서 구글링 해봤는데, StackOverFlow에서 간단히 답을 찾을 수 있었다.

- 검색 키워드 : how to save nil at dictionary value in swift

- Reference : How to add nil value to Swift Dictionary?

 


Dictionary 기본 문법

일반적으로 Dictionary는 이렇게 다룬다.

// Dictionary 생성
var juices: [String: String] = ["Apple": "Applecider", "Lemon": "Lemonade"]

// ✅ key/value pair 삭제
juices["Lemon"] = nil

// ✅ key/value pair 추가
juices["Grape"] = "Grape Juice" 

print(juices)  // ["Apple": "Applecider", "Grape": "Grape Juice"] 출력
  • 삭제 : Dictionary의 value에 nil을 할당하면, key "Lemon"과 value "Lomonade"가 삭제된다.
    주의 - key "Lemon"의 value로 nil을 저장하는 것이 아니다.
  • 추가 : 새로운 key "Grape"와 value "Grape Juice"를 Dictionary에 추가한다.

위와 같이 Dictionary의 value에 nil을 할당하면, 해당 key/value pair가 삭제된다.

그런데 value에 nil을 저장하려면 어떻게 해야 할까?

Dictionary의 value 타입을 옵셔널로 지정하고, 다시 nil을 할당해보자.

 

var juices: [String: String?] = ["Apple": "Applecider", "Starfruit": nil]

juices["Apple"] = nil  // 기존 key - key/value pair 삭제됨
juices["Plum"] = nil   // 새로운 key - key/value pair 추가 안됨

print(juices)  // ["Starfruit": nil] 출력
  • 맨 위부터 한 줄씩 살펴보자.
  • Starfruit : Dictionary를 생성할 때, value에 nil을 할당하면 정상적으로 저장된다.
  • Apple : 기존에 있던 key인 "Apple"에 nil을 할당하면, key/value pair가 삭제된다. (value로 nil이 저장되지 않음)
  • Plum : 기존에 없던 새로운 key인 "Plum"에 nil을 할당하면, key/value pair가 추가되지 않는다. (value로 nil이 저장되지 않음)

nil이 저장되지 않고, 여전히 key/value pair가 삭제된다. 

따라서 아래 세 가지 방법을 활용해야 한다.

방법-1. nil을 할당할 때 String? 타입임을 명시한다.

var juices: [String: String?] = ["Apple": "Applecider", "Starfruit": nil]

// 🍎 String? 타입의 nil을 할당
juices["Apple"] = nil as String?  // 기존 key - nil이 저장됨
juices["Plum"] = nil as String?   // 새로운 key - nil이 저장됨

print(juices)  // ["Starfruit": nil, "Apple": nil, "Plum": nil] 출력
  • Dictionary의 value로 nil as String? 을 할당한다는 것은 nil이 String? 타입임을 명시한다는 뜻이다.
  • Apple : 기존에 있던 key인 "Apple"에 상수 nilAsValue를 할당하면, value로 nil이 저장된다!
  • Plum : 기존에 없던 새로운 key인 "Plum"에 nil을 할당하면, key/value pair가 추가되고 value로 nil이 저장된다!

방법-2. updateValue 메서드를 사용한다.

var juices: [String: String?] = ["Apple": "Applecider", "Starfruit": nil]

// 🍎 updateValue 메서드를 호출
juices.updateValue(nil, forKey: "Apple")  // 기존 key - nil이 저장됨
juices.updateValue(nil, forKey: "Plum")   // 새로운 key - nil이 저장됨

print(juices)  // ["Starfruit": nil, "Apple": nil, "Plum": nil] 출력
  • Dictionary의 updateValue 메서드를 호출한다.
  • updateValue를 자동 완성했을 때 컴파일러가 타입 유추를 통해 value가 String? 타입임을 예상하기 때문에 nil 할당이 가능하다.
    따라서 value에 nil이 저장된다.

방법-3. nil을 상수/변수에 할당하고, 해당 상수/변수를 value에 할당한다.

var juices: [String: String?] = ["Apple": "Applecider", "Starfruit": nil]

// 🍎 nil을 상수에 할당하고, 해당 상수를 value로 할당
let nilAsValue: String? = nil
juices["Apple"] = nilAsValue  // 기존 key - nil이 저장됨
juices["Plum"] = nilAsValue   // 새로운 key - nil이 저장됨

print(juices)  // ["Starfruit": nil, "Apple": nil, "Plum": nil] 출력
  • Dictionary의 value로 nil 자체를 바로 할당하지 않는다.
    nil을 별도의 상수 nilAsValue에 할당하고, 해당 상수를 Dictionary의 value에 할당한다.
  • 이를 통해 컴파일러는 value가 String? 타입임을 알 수 있게 된다. 따라서 value에 nil이 저장된다.

 

- Reference

 

🍎 포스트가 도움이 되었다면, 공감🤍 / 구독🍹 / 공유🔗 / 댓글✏️ 로 응원해주세요. 감사합니다.

 

Comments