如何返回Swift枚举以处理错误条件

Zac*_*Zac 2 syntax error-handling enums swift

我正在尝试在Swift中创建一个简单的错误处理结构.我想要做的是返回一个包含"成功"代码或"错误"代码的类型.但是为了使它有点棘手,在错误的情况下,我还想得到一条消息和一个诊断字符串.

我想出了这个,编译得很好,就返回成功/错误而言效果很好:

enum PasswordValidationResult {
    case Success
    case PasswordError(message: String, diagnostic: String)

    func isValid() -> Bool {
        switch self {
        case .Success:
            return true
        case .PasswordError:
            return false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以返回所需的值:

return PasswordValidationResult.PasswordError(message: "You can't do that", diagnostic: "XYZ")
Run Code Online (Sandbox Code Playgroud)

当我尝试引用返回值时出现问题.

显然,我可以使用isValid()函数来测试成功条件,但是我找不到任何引用消息和诊断字符串的语法.

例如,试试这个:

  myError = someFunction()

  if myError == PasswordValidationResult.Error {
    // None of this will compile, at all...
    println(myError.message)
  }
Run Code Online (Sandbox Code Playgroud)

Air*_*ity 6

您可以使用以下方法提取枚举的关联值switch:

switch someFunction() {
case .Success:
    println("It worked!")
case .PasswordError(let message, let diag):
    println(message)
}
Run Code Online (Sandbox Code Playgroud)

除了其他好处之外switch,如果你的情况耗尽所有可能性(就像这里 - 枚举必须是两个值中的一个),你不需要默认值.如果你忘记并错过了一个,编译器会警告你.

注意,您还可以匹配特定值:

switch someFunction() {
case .Success:
    println("It worked!")
case .PasswordError("Password invalid", _):
    println("Please try again")
case let .PasswordError(message, diag):
    // more general error handling
}
Run Code Online (Sandbox Code Playgroud)