[Swift] 스위프트 [String: Any?] 타입에서 Any? nil 값 다루기

반응형

어느 프로그래밍 언어든 마찬가지 이겠지만 스위프트를 사용하다보면 아주 다양하게 딕셔너리 값을 사용하게 됩니다. 특히나 통신 파라미터를 만들기 위해서 요청(Request) 값을 만들다보면 자주 사용합니다. 하지만 대부분의 상황에서는 Any에 nil 값을 사용하지 않겠지만 일반적으로 nil 값을 넣으면 값이 추가되지 않는 것을 볼 수 있습니다.

 

 

아래 구문은 에상과 달리 key1의 값이 존재하지 않습니다. nil 포함하게 되면 "key1" 값은 포함되지 않게 됩니다.


var myDictionary: [String: Any?] = [:]

// nil 값을 포함하는 예시
myDictionary["key1"] = nil
myDictionary["key2"] = 42
myDictionary["key3"] = "Hello, World!"

// 딕셔너리 출력
print(myDictionary)


 

 

 

[String: String?] 의 타입의 경우는 어떨까요?  마찬가지로 "key1"의 값은 포함되지 않게 됩니다.


var myDictionary: [String: String?] = [:]

// nil 값을 포함하는 예시
myDictionary["key1"] = nil
myDictionary["key2"] = "Hi"
myDictionary["key3"] = "Hello, World!"

// 딕셔너리 출력
print(myDictionary)


 

 

 

이런 경우 아래와 같이 as? String으로 형변환 해줘야 합니다. 이렇게 형변환 하는 이유는 실제 nil이 어떤 타입의 nil 인지 알 수 없기 때문입니다.


var myDictionary: [String: String?] = [:]

// nil 값을 포함하는 예시
myDictionary["key1"] = nil as? String
myDictionary["key2"] = "Hi"
myDictionary["key3"] = "Hello, World!"

// 딕셔너리 출력
print(myDictionary)


 

 

 

 

그럼 다시 돌아가서 [String: Any?] 타입의 경우에도 as? 를 통해서 변환이 가능할까요? 그렇지 않습니다. 그럴땐 다음과 같이 처리해줘야 합니다. Any?.none 은 스위프트에서 옵셔널 타입 값 중에서 'none' 을 나타냅니다. 때문에 이 값을 Any 값으로 캐스팅 해줘야 합니다. 


var myDictionary: [String: String?] = [:]

// nil 값을 포함하는 예시
myDictionary["key1"] = Any?.none as Any
myDictionary["key2"] = "Hi"
myDictionary["key3"] = "Hello, World!"

// 딕셔너리 출력
print(myDictionary)


 

 

 

이런 방법을 모르면 딕셔너리 값을 만들때 왜 값이 빠져있는지 모르고 난처할 수 있습니다. 이제 딕셔너리를 만들때 nil을 자유 자재로 추가하실 수 있을 겁니다. 스위프트는 매우 간단한 언어이지만 깊게 들어가면 정말 다양한 방법과 다양한 언어의 특장점이 있습니다. 때로는 이런 것들로 인해서 문제가 발생하지만 재미있는 요소이기도 합니다.

반응형

댓글

Designed by JB FACTORY