안녕하세요. 개발하는 정주입니다.
오늘은 IBOutlet에서는 강제 언래핑을 하는 이유에 대해 포스팅하려고 합니다.
목차
IBOutlet는 강제 언래핑?
스토리보드로 iOS를 개발할 때면 IBOutlet을 사용하게 됩니다. 그럴 때마다 드는 의문이 있었습니다.
Swift에서는 옵셔널을 쓸 때 강제 언래핑은 삼가라고 합니다. 옵셔널 타입이 nil일 때 참조를 하게 되면 런타임 에러가 발생하기 때문입니다. 그런데 IBOutlet의 예제들, 심지어는 Xcode의 자동 완성조차 왜 강제 언래핑을 할까?라는 의문이 들었습니다.
IBOutlet이란?
고전 공식 문서를 살펴보면 Outlet을 아래처럼 설명하고 있습니다.
An outlet is a property that is annotated with the symbol IBOutlet and whose value you can set graphically in a nib file or a storyboard.
outlet은 IBOutlet 키워드를 이용해 nib 또는 Storyboard에서 뷰를 설정할 수 있는 프로퍼티라고 합니다.
또한 iOS App Dev Tutorial에도 IBOutlet과 관련된 내용을 찾을 수 있었는데요.
StoryBoard 상에 선언한 View 객체를 IB(Interface Builder)가 알아볼 수 있게 만드는 것이 바로 IBOutlet입니다.
즉 StoryBoard의 View 객체와 연관이 있다는 것입니다. 여기에서 IBOutlet은 강제 언래핑이 괜찮은 이유를 짐작할 수 있습니다.
IBOutlet은 강제 언래핑이 괜찮은 이유
저는 해당 포스팅을 작성하며 검색한 내용을 토대로 IBOutlet이 강제 언래핑이 괜찮은 이유를 아래 세 가지 이유로 정리하였습니다.
- IBOutlet은 StoryBoard의 View 객체와 Interface Builder를 연결한다.
- 강제 언래핑은 nil이 아니라는 것이 확실할 때만 사용한다.
- Swift는 불필요한 객체 등의 선언을 지양한다.
종합해보면 IBOutlet으로 선언한 View가 nil인건 "에러"이며 잘못된 시나리오로 흘러간 것이 아닐 가능성이 높습니다.
IBOutlet 객체가 nil일 때는 앱을 크래시 해서라도 수정해야 하고 만약 IBOutlet 객체를 사용하지 않을 것이라면 선언조차 하지 말라는 의미 같습니다. 따라서 IBOutlet에서만큼은 강제 언래핑을 권장(?)한다는 것이죠.
마무리
오늘은 IBOutlet에서 강제 언래핑을 하는 이유에 대해 알아보았습니다.
iOS 전반적인 개념과 Swift에서 권장하는 코드 스타일이 합쳐져 이러한 문화(?)가 생긴 게 아닌가 싶습니다.
감사합니다!
참조
https://developer.apple.com/tutorials/app-dev-training/connecting-outlets-and-actions/
https://velog.io/@myeongs07/iOS-IBOutlet-IBAction
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
swift, iOS, iOS 개발, 아이폰, 앱 개발, 개발, 코딩