Failable Initializer – Swift1.1の新機能
Xcode6.1からSwiftのバージョンが1.1になっています。
1.0からのリリースが早いですが、これで一旦落ち着くでしょう。
Swfit1.1の大きな変更点はFailbale Initializerです。
日本語だと、失敗することができる初期化でしょうか。
AppleのSwift Blogでも紹介されていますのでので、訳してみます。
Failable Initializers
Xcode6.1ではSwfitのバージョンが1.1になり、新機能としてfailable initializerが導入されました。
初期化はクラスや構造体のストアドプロパティに初期値を入力する処理です。初期化は失敗することもあります。例えば、ファイルからイメージをロードするときのように、初期化がリソースへのアクセスを必要とするときです。
NSImage(contentsOfFile: "swift.png")
ファイルが存在しなかったり何らかの理由で読むことができなかったときに、NSImageの初期化は失敗します。Swift1.1ではfailable initializerを使うことで対応することができます。failable initializerを使ってオブジェクトを生成すれば、結果はオブジェクト(初期化が成功したとき)またはnil(初期化が失敗したとき)となるオプショナル型となります。上の例にある初期化ではオプショナル型の結果を直接扱うことができます。
if let image = NSImage(contentsOfFile: "swift.png") { // loaded the image successfully } else { // could not load the image }
initで定義された初期化はinitの後に ? または ! をつけることでfailable initializerにすることができます。初期化処理で生成されるオブジェクトはoptionalな型になります。例として、IntにStringから変換をするfailable initializerをつけています。
extension Int { init?(fromString: String) { if let i = fromString.toInt() { // Initialize self = i } else { // return nil, discarding self is implied return nil } } }
failbale initilizer内では初期化が失敗したときには、nilを返します。他の値は返しません。初期化の失敗は、例えば文字列を整数としてパースできなかったときに起こります。失敗でなければ、selfにパースされた値が代入されます。
failable initializerはSwiftからファクトリーメソッドを使用する理由をなくします。ファクトリーメソッドは以前はオブジェクト生成に失敗したことを検知する唯一の方法でした。例えば、raw型をもつenumはoptionalなenum型を返すfromRawというファクトリーメソッドを持っていました。今のSwiftのコンパイラーは、raw値を引数にとりenumの各要素にそれを割り当てようとするfailable initializerに統合しています。例:
enum Color : Int { case Red = 0, Green = 1, Blue = 2 // implicitly synthesized var rawValue: Int { /* returns raw value for current case */ } // implicitly synthesized init?(rawValue: Int) { switch rawValue { case 0: self = .Red case 1: self = .Green case 2: self = .Blue default: return nil } } }
failable initialzerを使用することで、オブジェクト生成のSwift文法がより一貫的になります。つまり初期化とファクトリーメソッドの混乱や重複を取り除いて、言語を単純化します。Swfitではオブジェクト生成の一貫性を提供しつつも、今でもNSErrorを引数に持つ多くのCocoaのファクトリーメソッドを、初期化として使用することができます。
failable initializerについてはThe Swift Programming Languegeに詳しく書かれています。