TIL(Today I Learned)
11월 6일(금)
학습내용
- 옵셔널에 관하여 학습하였다.
- 암시적 추출 옵셔널은 선언 이후 언래핑 없이 사용 가능, 명시적 추출 옵셔널은 언래핑을 해야만 사용이 가능하다.
- 항상 왜 뷰컨트롤러에서 IBOutlet 변수의 타입을 암시적 추출 옵셔널로 선언하나 궁금했었다. 클래스의 프로퍼티가 모두 초기화 되어있어야 한다는 특성과 IBOutlet 변수는 뷰컨트롤러 인스턴스가 생성된 후에 초기화 된다는 특성 때문에 IBOutlet 변수의 타입을 암시적 추출 옵셔널로 선언함을 알 수 있었다. 즉, 뷰컨트롤러 인스턴스가 생성될 때 IBOutlet 변수를 초기화 할 수 없고, 이후에 스토리보드를 통해 초기화 할 수 있기 때문에 암시적 추출 옵셔널을 사용하는 것이다.
- Swift는 Objective-C로 구현 되거나 같이 병존해서 사용한다. 하지만 Objective-C는 옵셔널을 지원하지 않기 때문에 여러 문제가 발생할 수 있어서 암시적 추출 옵셔널은 위험하지만 필요하다.
- assert는 입력한 조건을 만족하면 지나가고, 만족하지 않으면 입력한 문자열을 출력한다.
- assert는 디버깅 모드에서만 작동하며, 앱을 배포하면 작동하지 않는다.
- 디버깅 중 조건의 검증을 위해 사용한다.
문제점/고민한점
- IBOutlet을 암시적 추출 옵셔널로 습관적으로 선언해서 사용하곤 했는데, 명시적 추출 옵셔널로 선언해서 사용이 가능한가?
- 강제 언래핑 사용은 무조건 지양해야 하는가?
해결방법
- IBOutlet을 암시적 추출 옵셔널로 습관적으로 선언해서 사용하곤 했는데, 명시적 추출 옵셔널로 선언해서 사용이 가능한가?
- 사용이 가능하다. 하지만 IBOutlet 변수를 사용할 때 항상 언래핑 해야하는 불편함이 있고, 스토리보드에서 IBOutlet 변수를 무조건 초기화할 것이라는 신뢰(?)가 있기 때문에 예외적으로 IBOutlet 변수를 암시적 추출 옵셔널으로 선언하는 것이라고 생각하였다.
- 강제 언래핑 사용은 무조건 지양해야 하는가?
- 배포용 앱을 빌드할 코드에는 강제 언래핑을 사용하지 않아야 한다고 생각한다. 빠르게 코드를 작성해서 테스트를 할때만 강제 언래핑을 사용하고 다음에 이를 옵셔널 바인딩으로 교체해야 한다. nil 값으로 인해 발생할 수 있는 문제를 최소화해야 앱의 신뢰성 측면에서 좋고, 디버깅의 범위도 줄어들기 때문이다.