Implicitly Unwrapped Optionals의 사용 사례를 설명하기 전에 Swift에있는 Optionals 및 Implicitly Unwrapped Optionals가 무엇인지 이해해야합니다. 그렇지 않은 경우 먼저 옵션에 대한 내 기사를 읽는 것이 좋습니다.
암시 적으로 래핑되지 않은 옵션을 사용하는 경우
하나는 암시 적으로 래핑되지 않은 옵션을 만드는 데는 두 가지 주요 이유가 있습니다. nil
Swift 컴파일러는 항상 선택적으로 옵션을 풀어야하기 때문에 액세스 할 수없는 변수를 정의하는 것과 관련이 있습니다 .
1. 초기화 중에 정의 할 수없는 상수
초기화가 완료 될 때까지 모든 멤버 상수에는 값이 있어야합니다. 때로는 초기화하는 동안 상수를 올바른 값으로 초기화 할 수 없지만 액세스하기 전에 값을 가질 수는 있습니다.
Optional 변수를 사용하면 Optional이 자동으로 초기화되고 nil
결국에는 포함 할 값이 변경되지 않기 때문에이 문제를 해결할 수 있습니다. 그러나 확실히 아는 변수가 끊임없이 풀리는 것은 고통이 될 수 있습니다. 암시 적으로 래핑되지 않은 선택 사항은 선택 사항과 동일한 이점을 제공하며 추가 혜택을 통해 어디에서나 명시 적으로 래핑 할 필요가 없습니다.
이에 대한 좋은 예는 뷰가로드 될 때까지 멤버 변수를 UIView 서브 클래스에서 초기화 할 수없는 경우입니다.
class MyView: UIView {
@IBOutlet var button: UIButton!
var buttonOriginalWidth: CGFloat!
override func awakeFromNib() {
self.buttonOriginalWidth = self.button.frame.size.width
}
}
여기서는 뷰가로드 될 때까지 버튼의 원래 너비를 계산할 수 없지만 뷰의 awakeFromNib
다른 메소드 (초기화 제외) 전에 호출 될 것임을 알고 있습니다. 클래스 전체에서 값이 명시 적으로 래핑되지 않도록 강제하는 대신 암시 적으로 래핑되지 않은 옵션으로 선언 할 수 있습니다.
2. 앱이 변수로부터 복구 할 수없는 경우 nil
이는 극히 드물지만 변수에 nil
액세스 할 때 앱을 계속 실행할 수 없으면 테스트를 방해하는 데 시간이 낭비됩니다 nil
. 일반적으로 앱이 계속 실행 되려면 반드시 참이어야하는 조건이있는 경우을 사용합니다 assert
. 암시 적으로 래핑되지 않은 옵션에는 nil이 내장되어 있습니다. 그럼에도 불구하고, 선택 사항을 풀고 더 설명이없는 주장을 사용하는 것이 종종 좋습니다.
암시 적으로 래핑되지 않은 옵션을 사용하지 않는 경우
1. 지연 계산 된 멤버 변수
때로는 nil이 아니어야하는 멤버 변수가 있지만 초기화 중에 올바른 값으로 설정할 수없는 경우가 있습니다. 한 가지 해결책은 암시 적으로 래핑되지 않은 옵션을 사용하는 것이지만 더 좋은 방법은 지연 변수를 사용하는 것입니다.
class FileSystemItem {
}
class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// load contents and append to loadedContents
return loadedContents
}()
}
이제 멤버 변수 contents
는 처음 액세스 될 때까지 초기화되지 않습니다. 이를 통해 클래스는 초기 값을 계산하기 전에 올바른 상태로 들어갈 수 있습니다.
참고 : 이것은 위에서 # 1과 모순되는 것처럼 보일 수 있습니다. 그러나 중요한 차이점이 있습니다. buttonOriginalWidth
위는 속성에 액세스하기 전에 버튼 폭 변화하는 사람을 방지 할 수있는 viewDidLoad시 설정해야합니다.
2. 그 밖의 모든 곳
대부분의 경우, 잘못 사용하는 경우에 액세스 할 때 전체 앱이 중단되므로 암시 적으로 래핑되지 않은 선택 사항을 피해야합니다 nil
. 변수가 nil 일 수 있는지 확실하지 않은 경우 항상 기본 옵션을 사용하는 것이 기본값입니다. 절대로 절대 변수가 nil
되지 않는 것은 크게 아프지 않습니다.
if someOptional
. 더 이상 사용할 수 없습니다 .