2016-05-15 35 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

Swift允許您的ErrorType擁有關聯的數據。這或多或少是從NSError開始的userInfo的爆炸版本。如果你想要方便,可以編寫一個函數來轉換​​枚舉NSError

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... 
} 

你可以拋出一個錯誤與message: nil獲取默認的消息,或從當地實際情況添加自己的自定義消息:

throw Problems.Bad(message: "I have a bad feeling about this")