2016-05-15 58 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")