암묵적 언랩 옵셔널 타입이 함수의 인자로 오는 경우 (Swift)

간혹 T! 타입이 함수의 인자로 들어가는 경우를 종종 볼 때가 있다. 주로 C나 Objective-C 라이브러리를 사용할 때, 이런 경우를 볼 수 있었다. 특정 연산의 결과를 T! 타입으로 미리 선언하는 것은 그럴 수 있다 하겠는데, 함수의 인자라면 호출하는 곳의 관점으로는 옵셔널이거나 아니면 옵셔널이 아니거나 둘 중 하나일 것인데 왜 이런 시그니쳐가 보이는 것일까?

결론부터 이야기하면 Objective-C 의 언어적 한계 때문이다. 임의의 클래스의 객체를 받는 인터페이스가 있다고 하자. Objective-C에서 객체를 가리킬 수 있는 모든 변수 타입에는 nil이 들어갈 수 있고, nil에 어떤 메시지를 보내는 것은 아무런 일도 일어나지 않지만 Objective-C 에서는 문법적으로 합당한 행위이다. 따라서 모든 Objective-C 객체 타입은 Swift의 입장에서 보면 옵셔널인데, 정작 Objective-C 문법은 별도로 옵셔널을 지원하지 않는데. 이러한 차이에서 Swift 컴파일러는 Objective-C API를 반입할 때, T? 타입일 수 있을 값을 T! 로 바꿔서 표시해준다.

물론 사용하는 Swift 코드의 입장에서는 이러한 API를 호출할 때에는 T? 타입의 옵셔널이든 T 타입의 객체값이든 어떤 것을 넘겨도 동작에는 상관없다.

참고로 Objective-C에서 nullable, nonnull 어노테이션이 추가되면서 많은 API에서 이러한 표현은 제거되었고, 실제 옵셔널이 필요한 부분에서는 T? 타입을, 그렇지 않은 부분에서는 T 타입을 받도록 업데이트되어 있다.