所有类型都可以用作Swift中的错误?

PPP*_*PPP 3 error-handling swift

我知道Enum的用法如下,那么Array或Dictionary呢?

enum VendingMachineError: Error {
  case invalidSelection
  case insufficientFunds(coinsNeeded: Int)
  case outOfStock
  }

throw VendingMachineError.insufficientFunds(coinsNeeded: 5)
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 6

Error可以使用符合协议的任何类型.如果你真的想抛出一个数组,那么声明符合协议就足够了:

extension Array: Error {}

do {
    throw [1, 2, 3]
} catch {
    print("Failed:", error) // Failed: [1, 2, 3]
}
Run Code Online (Sandbox Code Playgroud)

这是更现实的例子,使用a struct来抛出带有附加信息的错误(Swift 3错误和附加数据的简化示例 ):

struct ParserError: Error, LocalizedError {
    let line: Int

    public var errorDescription: String? {
        return "Parser error at line \(line)"
    }
}

func parse() throws {
    throw ParserError(line: 13)
}

do {
    try parse()
} catch let error {
    print(error.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)

输出:

Parser error at line 13
Run Code Online (Sandbox Code Playgroud)

  • @AhmadF:使用数组更像是一个理论的例子,我没有看到它的实际用法.我添加了一个更现实的非枚举示例的链接. (2认同)