SwiftのクラスのFailable Initializersでは先にプロパティを初期化してないとダメなのか?

なんで?

なぜプロパティを初期化しなければいけない?

現在failable initializersのページ(swift 2.1)を読んでいて、クラスfailable initializersの仕様が良く分からなくてうんうん悩んでいました。

良く分からなかった部分は、

なぜnilにするのに、プロパティに初期値を与えておかないといけないのか?

ということと、そもそも公式マニュアルにある文章が良く分からなかった(英語の理解不足だと思っていますが)という点。例えば、swift 2.1では、以下の例はコンパイルエラーになるようです。

// プロパティの初期化とinitialization failureの条件判定を入れ替え
class Product {
    let name: String!
    init?(name: String) {
        if name.isEmpty { return nil } //<-- compile error
        self.name = name
    }
}

// コンパイルエラー:"All stored properties of a class instance must be initialized before returning nil from an initializer" 

不思議だと思ったらswift2.2で改善されてた

ところがどっこい、swift 2.2だと、上記のコードは問題なくコンパイル通ります。下のstackoverflowのリンクに色々書いてありますが、「昔のswiftだと部分的に初期化されたクラスを破棄するのが無理だったけど、将来なんとかする(swift2.2で直った <- 今ココ)」ということのようです。

This is an implementation limitation in the swift 1.1 compiler, documented in the release notes. The compiler is currently unable to destroy partially initialized classes in all cases, so it disallows formation of a situation where it would have to. We consider this a bug to be fixed in future releases, not a feature.

下記のstackoverflowの議論から抜粋。元々のソースのリンクは、記事内参照。

このサイトを立ち上げた時はswift 2.1でしたので、変なこだわり(途中でドキュメントを切り替えるのが面倒だった)でずっと2.1を参考にしていました。が、しかし、2.2のドキュメントに切り替えた方が良いような気がしてきましたので、早急に切り替えます。Swift3になった場合、さらに大幅な修正が必要な気もしますが、それはその時考えることに・・・。

参考:Best practice to implement a failable initializer in swift
http://stackoverflow.com/questions/26495586/best-practice-to-implement-a-failable-initializer-in-swift

スポンサーリンク
広告1
広告1

シェアする

フォローする