LoginSignup
1
0

More than 5 years have passed since last update.

クラス内のForceUnwrapしたBoolプロパティに三項演算を利用するとコンパイル時にSegmentationFaultする

Posted at

この現象は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値しかとらないので、デフォルト値を決めて定義してあげたほうがコンパイラに優しいんだなというお気持ちになりました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0