下の記事は swift1 のときのものなのでたぶん動かないです。swift2版の記事を書きました
>> [iOS] swift2でもエラーハンドリングしたい NSError, do catch
ここから元記事です
==========================================
こんにちは。きんくまです。
今回はswiftでもエラーハンドリングしたい!です。
Objective-Cのときに調べたのはこちら
>> [iOS] NSErrorでエラーハンドリングしたい
リンク先にも書いてあるのですが、エラーは実行時に起きるもので、例外は出荷時にはなるべくおきないようにしておくのでした。
これはswiftでも同じようです。
ポイントは
・NSErrorのポインター型のNSErrorPointerがある
・自前でメソッドの中でエラーを代入したいときは、NSErrorPointerのmemoryプロパティに入れる
・NSErrorPointerのmemoryは読み取りもできて、ポインターの中身がnilどうかのチェックもできる
っていう感じです。
今回、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") }
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ