IBOutlet의 강제 언래핑

나이든별 / Oldstar·2022년 5월 29일
0

Think about Keywords

목록 보기
24/37

공부한 것

  • IBOutlet. 특히, 왜 강제 옵셔널 언래핑이어야만 하는가에 대해서.

고민한 점 및 생각해본 점

  • 당연한 것은 없다는 것이다. 기본적으로 IBOutlet은 강제 옵셔널 언래핑이 붙어서 생성이 된다. 하지만 왜 그럴까?
  • 일단 이렇게 사용하는 것 자체의 이유만 알고 싶다면, 좋은 해답이 있다. 애플이 그렇게 하기를 권장하기 때문(...). (첫 번째 착지점)
  • 근본적인 의문을 가져볼 수 있겠다. 이미 자신이 작성해서 확실히 값이 존재함을 알고 있는 프로퍼티에 대해서도, 강제 옵셔널 언래핑을 사용하기보다는 다른 방식을 사용한다. 그러면 도대체 왜? IBOutlet만??
  • viewDidLoad()가 아직 되지 않은 상태라면, 각종 레이블이나 서브뷰 처럼 뷰컨트롤러가 들고 있는 프로퍼티들은 아직 로드되지 않은 상태인 것이 맞는다.
  • 바꿔서 말하면, viewDidLoad() 호출 이후에는 해당 값들이 존재함이 보장되므로, 강제 언래핑이어도 일단은 괜찮다는 것이다. (두 번째 착지점)
  • IBOutlet이 기본적으로 변수로 지정되는 이유도 여기에 있다. viewDidLoad() 이전에는 값이 없는 상태이지만, viewDidLoad() 이후에는 새로운 값을 '새로 할당' 해줘야 하기 때문. 마치 테스트 코드를 짤 때, sut을 강제 옵셔널 해제 변수로 만들어 놓고 setUpWithError()에서 테스트하고자 하는 인스턴스를 넣어주는 과정과 비슷하달까..
  • 이 강제 언래핑이 문제가 되는 시점은 언제냐면.. 미처 로드되지 않은 뷰에 접근하고자 할 때.
  • 해당 오브젝트의 생명 주기 안에서, 아직 값이 nil일 때 불러와야 할 일이 있다면, 이것은 강제 옵셔널로 지정되어서는 안 되겠다.
  • 상술한 케이스를 아예 회피하는 방향으로 앱을 짤 것인지, 아니면 저 정도 리스크를 항상 고려하는 방향으로 앱을 짤 것인지. 그때그때 상황에 따라 적절한 해결책을 고르면 되겠다고 여겨진다.

참조

https://blog.curtisherbert.com/to-optional-or-not-to-optional-iboutlet/
https://cocoacasts.com/should-outlets-be-optionals-or-implicitly-unwrapped-optionals

profile
함께 나아가고자 하는 사람

0개의 댓글