[iOS] swiftでもエラーハンドリングしたい!

2015/01/24

下の記事は swift1 のときのものなのでたぶん動かないです。swift2版の記事を書きました
>> [iOS] swift2でもエラーハンドリングしたい NSError, do catch

ここから元記事です
==========================================

こんにちは。きんくまです。

今回はswiftでもエラーハンドリングしたい!です。

Objective-Cのときに調べたのはこちら
>> [iOS] NSErrorでエラーハンドリングしたい

リンク先にも書いてあるのですが、エラーは実行時に起きるもので、例外は出荷時にはなるべくおきないようにしておくのでした。

これはswiftでも同じようです。

>> Swiftのエラーハンドリング

ポイントは
・NSErrorのポインター型のNSErrorPointerがある
・自前でメソッドの中でエラーを代入したいときは、NSErrorPointerのmemoryプロパティに入れる
・NSErrorPointerのmemoryは読み取りもできて、ポインターの中身がnilどうかのチェックもできる

っていう感じです。

>> Error Reporting

今回、NSErrorPointerの引数をもつあるメソッドから、さらにNSErrorPointerの引数をもつメソッドを呼び出したいときの処理がわからなくて調べてたのですが、そのままわたしてあげたらうまくいきました。

サンプルのコード

class ErrorSample{
    func method1(errorPtr:NSErrorPointer){
        //引数のerrorPtrにnil入れてもコンパイルエラーにならないから
        //実行時チェックが必要
        if errorPtr == nil {
            return
        }
        
        //さらにNSErrorPointerの引数をもつメソッドを呼び出すサンプル
        self.method2(errorPtr)
        
        //ポインターの中身(NSError or nil)を見るときはmemoryで
        if errorPtr.memory == nil {
            println("nil")
        }else{
            println("not nil")
        }
    }
    
    func method2(errorPtr:NSErrorPointer){
        if errorPtr != nil {
            //memoryにNSErrorを入れてあげる
            errorPtr.memory = self.createError()
        }
    }
    
    func createError() -> NSError{
        return NSError(domain: "com.kumade.Sample", code: 100, userInfo: ["NSLocalizedDescriptionKey":"Sample Error"])
    }
}

var sample = ErrorSample()
var myError:NSError?
//ここをsample.method1(nil)にしてもコンパイルは通る
sample.method1(&myError)

if myError != nil {
    println("Error => \(myError?.localizedDescription)")
}else{
    println("Error is nil")
}
LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

LINEスタンプ作りました!
毎日使える。とぼけたウサギ。LINEスタンプ販売中! 毎日使える。とぼけたウサギ

ページトップへ戻る