2016-05-15 10 views
2

Swift例外ハンドラからNSAlertスタイルのエラーシートを生成したいとします。 Objective-Cの持つ過去には、私は単にスウィフトと今[NSAlert alertWithError:]を使用することができ、それがミックスの中で独自の例外処理システムの、アラートはかなり無骨な感じ:Swift例外からエラーシートを生成する

enum Problems: ErrorType { 
    case Bad 
    case Worse 
} 

func f() throws { 
    throw Problems.Worse 
} 

func g() { 
    let errorMessage: String 

    do { 
    try f() 
    } 
    catch Problems.Bad { 
    errorMessage = "This was bad" 
    } 
    catch Problems.Worse { 
    errorMessage = "This was even worse" 
    } 
    catch { 
    errorMessage = "This was unexpected" 
    } 

    guard errorMessage == nil else { 
    let alert = NSAlert() 
    alert.messageText = "Error" 
    alert.informativeText = errorMessage 
    alert.beginSheetModalForWindow(self, completionHandler: { [unowned self] (returnCode) -> Void in 
     if returnCode == NSAlertFirstButtonReturn { 
     // Handle the response 
     } 
    }) 
    } 

これはクルージ感じているとあれば、それはうまくスケールしないようにそこチェックする必要のある多くのエラー状態です。より良い方法がありますか?

答えて

0

スウィフトでは、ErrorTypeに関連データを持たせることができます。これはほぼuserInfoの分解バージョンで、NSErrorからです。あなたがmessage: nilでエラーをスローすることができます

enum Problems: ErrorType { 
    case Small 
    case Bad(message: String?) 
    case Worse(message: String?) 

    func toNSError() -> NSError { 
     var errorMessage = "" 

     switch self { 
     case .Small: 
      errorMessage = "Small error" 
     case let .Bad(msg): 
      errorMessage = msg ?? "Default bad message" 
     case let .Worse(msg): 
      errorMessage = msg ?? "Default worse message" 
     } 

     return NSError(domain: NSCocoaErrorDomain, code: 1, userInfo: [NSLocalizedDescriptionKey: errorMessage]) 
    } 
} 

func f() throws { 
    throw Problems.Worse(message: nil) 
} 


do { 
    try f() 
} catch let error as Problems { 
    let err = error.toNSError() 
    // now display NSAlert with err... 
} 

デフォルトのメッセージを取得、または地域の状況から、独自のカスタムメッセージを追加するために:あなたは利便性が必要な場合は、​​列挙NSErrorに変換するための関数を書くことができます

throw Problems.Bad(message: "I have a bad feeling about this") 
関連する問題