読者です 読者をやめる 読者になる 読者になる

しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swift再入門19 − The Swift Programming Languageを読んでみる

この記事では「The Swift Programming Language」を1から読んだ感想とか発見を書いてみようと思います。
「The Swift Programming Language」とはSwiftの公式ドキュメントでiBooksや下ページで見る事ができます。

The Swift Programming Language (Swift 2.1): About Swift

読んだ所

今回はError Handlingという項目を読みました。

The Swift Programming Language (Swift 2.1): Error Handling

学んだこと

throws/throw

エラーは下のように発生させます。
エラーが起こりうるメソッドではメソッドにthrowsを付ける必要があります。

enum MyError: ErrorType {
    case Error1
    case Error2(message: String)
}

func method() throws {
    throw MyError.Error2(message: "")
}

Initializerにthrowsを付ける事もできます。

class MyClass {
    init() throws {
        throw MyError.Error1
    }
}

try

エラーを投げる可能性のあるメソッドを呼ぶ際は下のようにdo-catchで囲んでtryを付ける必要があります。

do {
    try MyClass()
} catch MyError.Error2(_) {
} catch {
}

try?を使えばdo-catchは不要になります。
この場合、valueはオプショナル型です。

let value = try? MyClass()

try!を使うとオプショナル型にならない代わりにエラー時にアプリがクラッシュします。

let value = try! MyClass()

throws付きのメソッド内で呼ぶ場合はtryだけでも構いません。

func method() throws {
    let value = try MyClass()
}

rethrows

メソッドはthrowsの代わりにrethrowsを使える事があります。
rethrowsは引数がクロージャーで、かつそれがエラーを発生しうる時だけ定義できます。

rethrowsを使うと通常のthrowが使えなくなります。

func method(closure:() throws ->Void) rethrows {
    try closure()
    // throw MyError.Error1 // throwsだとこれもできるけどrethrowsではできない
}