Non-Optional Any가 nil인지 체크하기

swift에는 nil (NULL)이 될 수 있는 Optional 형태, 될 수 없는 Non-Optional 형태로 데이터형을 지정할 수 있습니다. 간단하게 데이터형 뒤에 물음표만 붙이면 되는데, 신기하게도 nil이 될 수 없다고 생각하지만 사실 nil이 될 수 있는(??) 형태가 있습니다.

Any

일반적으로 코드를 작성할 때 Any 타입을 사용하는 경우는 많지 않습니다만, 절대적으로 필요할 때가 있습니다. 제가 제일 많이 사용하는 경우는 서버에 API Request 시 보내는 Parameter를 [String:Any] 형태로 받고 있습니다. 어쩄든 일반적으로 생각한다면, Any라고 명시하면 nil이 될 수 없는 형태 (Non-Optional)가 되겠죠?

실제로 위와 같은 형태로 작성하면 오류가 나며, ?를 붙이라고 조언까지 합니다.

하지만 아래같은 경우는 Any 타입임에도 불구하고 nil이 들어갈 수 있습니다. 이러한 상황 뿐만 아닌 다양한 상황에서도 들어갈 수 있죠.

왜 이런 상황이 벌어질 수 있냐에 대한 답은 의외로 간단합니다. 왜냐면 Any는 모든 값이 될 수 있기 때문에(…?) Optional 값도 들어갈 수 있는 것입니다. 

사실 데이터형 뒤에 물음표(?)를 붙이면 Optional<형태> 와 같은 열거형의 형태가 되고 실제로는 이런 모습처럼 됩니다.

Any 형태 역시 nil이 될 수 있는 Any? 와 같이 명시할 수 있지만 Any 형태로도 nil가 될 수 있는 이유는 모든 형태가 될 수 있기 때문이기 때문입니다. 실제로 위의 코드 예제는 아래와 완벽히 같다고도 할 수 있습니다.

본론으로 넘어가서, 그럼 단순하게 Any가 nil인지 아닌지 체크하려면 그냥 이렇게 하면 되지 않을까? 라고 생각할 수 있습니다.

하지만 이는 무조건 실패합니다. Non-Optional 변수를 nil이랑 비교해봤자 의미가 없다고 하거나 못 한다고 하기 때문에.. -_- 하지만 위와 같은 원리를 활용하면 비교가 가능합니다.

생각해보면 참 복잡한 형태가 되었는데.. 사실 이런 경우가 많지는 않다고 생각합니다. 같은 상황이 되었다면 저처럼 헤매지 마시고 부디 이 글을 참고하시면 좋을 듯 합니다.

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.