nil을 넣을 수 있는거임? Dictionary도?

김도희·2022년 10월 3일
8
post-thumbnail

Dictionary에서 키-값 쌍을 제거하는 방법으로 해당 항목에 nil 값을 할당하는 것을 배웠다

var capital: [String:String] = ["KR":"Seoul", "EN":"London", "FR":"Paris"]
print(capital) //["EN": "London", "KR": "Seoul", "FR": "Paris"]
capital["EN"] = nil
print(capital) //["KR": "Seoul", "FR": "Paris"]

그런데 분명 Optional에 대해서 배울 때 nil은 Optional Type에만 넣을 수 있다고 했다

var cat: String = "chap"
print(cat)
cat = nil
print(cat)
//error: 'nil' cannot be assigned to type 'String'

위처럼 Optional이 아닌 일반 Data type에 nil을 할당하면 'nil'을 'String' 유형에 할당할 수 없다고 한다. 그런데 어떻게 optional로 선언하지도 않은 dictionary에 nil을 넣을 수 있는지??


공식문서를 찾아보니 subscript로 요소에 접근하면 반환값이 Optional Type이다

key가 dictionary에 있으면 value를 반환하고, key가 없으면 nil을 반환한다
dictionary에 없는 key 값이 입력될 때를 대비하기 위해서 무조건 optional을 씌우는 것이다!

print(capital["KR"]) //Optional("Seoul") 
print(capital["JP"]) //nil

그럼 value 값에 nil을 넣고 싶은 경우는?!!

1. Type Casting

var capital: [String:String?] = ["KR": "Seoul", "EN": nil]
capital["KR"] = nil as String? //기존 key
capital["FR"] = nil as String? //새로운 key
print(capital) //["EN": nil, "KR": nil, "FR": nil]

2. 변수나 상수에 nil을 할당해서 value에 넣기

var capital: [String:String?] = ["KR": "Seoul", "EN": nil]

let dictNil: String? = nil
capital["KR"] = dictNil
print(capital) //["EN": nil, "KR": nil]

3. updateValue(_:forKey:)

var capital: [String:String?] = ["KR": "Seoul", "EN": nil]
capital.updateValue(nil, forKey: "KR")
print(capital) //["EN": nil, "KR": nil]


참고 > 공식문서 Dictionary/subscript(_:), Dictionary/updateValue(_:forKey:), stackoverflow

3개의 댓글

comment-user-thumbnail
2022년 10월 4일

헉 swift의 dictionary를 subscript로 접근하면, 그니까 key 값으로 접근하면 반환값 자체가 옵셔널 타입이어서 dictionary의 아이템 삭제에 nil을 넣어도 되는군요! 놀라운 사실🫶입니다

답글 달기
comment-user-thumbnail
2022년 10월 7일

Array에서의 subscript와는 엄연히 다른 개념이군요?

답글 달기
comment-user-thumbnail
2022년 10월 10일

Thanks for sharing that information..

Kohl's Feedback Survey

답글 달기