この現象はSwift3系のみで発生します。
Swift2、Swift4では正しくコンパイル出来ることを確認しました。
問題の発生するコード
class Foo {
private var bool: Bool!
func setup(_ bool: Bool) {
self.bool = bool
}
func test() {
let result = bool ? "OK" : "NG" // このコードでSegmentationFaultが発生します。
print(result)
}
}
対処
イニシャライザで初期化出来ないけど、そのプロパティが初期化されているという前提がある場合、初期値を予め代入するようにしてForceUnwrapで型を定義するのをやめる。
class Foo {
- private var bool: Bool!
+ private var bool: Bool = false
func setup(_ bool: Bool) {
self.bool = bool
}
func test() {
let result = bool ? "OK" : "NG"
print(result)
}
}
UIViewやUViewControllerなどはInterfaceBuilderを利用する前提だとイニシャライザでプロパティの初期化をすることが出来ないため、苦肉の策としてプロパティをForceUnwrapするということは割りとみんなやっているんじゃないかと思うのですが、
Bool型については2値しかとらないので、デフォルト値を決めて定義してあげたほうがコンパイラに優しいんだなというお気持ちになりました。