2016-05-15 10 views
2

Ich möchte ein NSAlert-style Fehlerblatt von einem Swift Exception-Handler generieren. In der Vergangenheit mit Objective-C habe ich einfach [NSAlert alertWithError:] Jetzt mit Swift verwenden könnte und seine eigene Exception-Handling-System in der Mischung, fühlen Warnungen eher klobig:Generate Error Sheet von Swift Exception

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

Das fühlt sich kludgy und wie es nicht gut skalierbar ist, wenn es Es gibt viele Fehlerbedingungen, die überprüft werden müssen. Gibt es einen besseren Weg?

Antwort

0

Swift ermöglicht Ihrer ErrorType zugeordnete Daten. Dies ist mehr oder weniger eine explodierte Version von userInfo von NSError. Wenn Sie Bequemlichkeit wollen, können Sie eine Funktion schreiben, um eine Problems Enum umwandeln zu 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... 
} 

Sie haben einen Fehler mit message: nil werfen können die Standard-Nachricht zu bekommen, oder eine eigene Nachricht von den örtlichen Gegebenheiten hinzu:

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