[Swift] 脱初心者 class initializer おさらい(3: failable initializer)

     

TAGS:

⌛️ < 1 min.
class initializer 説明の3回目です。複数の initializer を使い分けることが良いコードにつながります。

全3回で説明してます。その3回目です。

[Swift] 脱初心者 class initializer おさらい(1: designated initializer と convenience initializer)

[Swift] 脱初心者 class initializer おさらい(2: クラス継承と required initializer)

initializer からのエラー

ここまで説明してきた initializer は、何らかのオブジェクトを生成することが前提でした。

しかし、場合によっては、オブジェクトを生成したくない/できないときもあるかもしれません。

そのようなケース向けに、nil を返すことができる initializer を定義することができます。

“failable initializer” と呼ばれます。 failable = “fail”(失敗) + “able”(できる)という命名になっている通り、失敗するかもしれない initializer です。

failable initializer

Initializer は、init( ) という名称を持つ必要があり、返り値は設定できません。ですので、failable initializer は、すこし特殊な定義方法となります。

failable initializer 例


class Example {
    var a:Int
    init?() {
		return nil // always fail initializer
    }
}

定義としては、init? という名前の関数を定義することになります。意味的には、”init() -> Example?” 的な意味です。

このように定義することで、nil を返すことが可能です。

上記の例は、常に nil を返す initializer になっています。通常は、条件判定によって、返すことになります。

通常の initialize で nil を返せないかやってみます。

example code


class Example {
    var a:Int
    init() {
        return nil   // error : Only a failable initializer can return 'nil'
    }
}

このように、failable initializer でないと、nil を返せず、コンパイルエラーとなります。

designated initializer/ convenience initializer との関係

failable initializer は、designated initializer になれる?

なれます。例えば、以下のケースでは、1つの failable initailizer を designated initializer として定義しています。

example code


class Example {
    var a:Int
    init?(_ value: Int) {
        if value == 3 {
            return nil     // 設定値として3を渡されたら失敗
        }
        a = value
    }
}

failable initializer は、convenience initializer になれる?

なれます。以下のケースでは、1つの failable initalizer を convenience initializer として定義しています。
初期化が必要な property がありますので、別途 designated initializer は必要となります。

example code


class Example {
    var a:Int
    init(_ value:Int) {     // designated initializer
        a = value
    }
    convenience init?(_ value: Int, coeff:Int) { // convenience failable initializer
        if coeff == 1 {
            return nil
        }
        self.init(value * coeff)
    }
}

まとめ:initializer の種類まとめ

class initializer は、何種類かありますが、適材適所に使うことで、コードがレベルアップします。

class initializer の種類
default initializer
property が自動的に決められるときに、自動的に作成される
designated initializer
必ず呼ばれなければいけない、全ての property を初期化する initializer
convenience initializer
初期化方法を複数提供するための initializer、designated initializer を呼ばなければいけない
required initializer
継承した子クラスから override されなければいけないことを指定された initializer
failable initializer
オブジェクト生成でエラーが発生するかもしれない initializer

個別の項目をきちんと理解することも大切ですが、全体を俯瞰して理解することも大事です。俯瞰した理解には、以下のような書籍を使うのが近道です。

Swift 学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

Swift ポケットリファレンス

Swift を学んでも、プログラミング言語の文法を全て記憶しておくことは無理なので、ちょっとした文法の確認をするために、リファレンス本を手元に置いておくと便利です。

注意

Swift4 までしか対応していないので、理解して参照する必要があります。

説明は以上です。
不明な点やおかしな点ありましたら、ご連絡いただけるとありがたいです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です