swift – 自定义错误类型初始化程序

让我加上为什么我认为这不是How to provide a localized description with an Error type in Swift?的重复

提供的答案仍然会导致一些静态/类函数调用,而不是初始化器样式或需要转换为NSError(我想避免).

简要总结一下原因:

抛出的Swift函数不会声明错误类型.我们不能强制执行catch以传递简单地符合Error协议的自定义类型.知道在do-catch方面,我们没有得到编译器的帮助,因为我们得到了什么类型(如果是自定义的)错误,默认情况下我们会期望已知的NSError属性.否则,我们需要简单地依赖文本文档来解释我们可以捕获的错误类型,因为catch只会传递一个Error类型.

现在,与NSError不同,Error是一种协议,我们在userInfo中获取的属性是只读的.所以我们求助于构造NSError类型,并将其转换为Error.

我试图创建一个简单的干净结构,返回一个错误类型(不是NSError),我可以抛出:

throw MYError(domain: "com.somthing.error", code: 0, userInfo: [NSLocalizedDescriptionKey : "Something bad happened"])

主要问题是设置NSLocalizedDescriptionKey的唯一方法是初始化NSError对象.这样做将需要转换为错误类型(这是我试图避免的).

我首先尝试使用扩展错误{…,但不能使用初始化程序.

如果我使用符合错误协议的结构(struct MyError:Error {…),我仍然遇到只有获取localizedDescription的问题.

我使用的实际上是这样的:

struct MYError: Error {

    static func with(domain: String = "com.somthing.error", code: Int = 0, localizedDescription: String) -> Error {
        return NSError(domain: domain, code: code, userInfo: [NSLocalizedDescriptionKey : localizedDescription]) as Error
    }
}

我可以使用如下:

throw MYError.with(localizedDescription: "Some Error has happened")

直观地说,我希望像MYError这样的类型只使用初始化器MYError(域:…,而不是静态函数).

Swifty的方式更像是:

enum ErrorType: Error {
    case one
    case two
    case three(with: String)
}

...

// In some function:
throw ErrorThrown.three(with: "Three!")

...

// Catch like:
catch ErrorType.three(let str) {
    print("Error three: \(str)")
}

目前尚不清楚我们是否还在那里.似乎NSError仍在发挥作用,我知道我可以期望将localizedDescription作为可选的localizedFailureReason和熟悉的NSError属性.

最佳答案
How to provide a localized description with an Error type in Swift?类似
您可以定义采用LocalizedError的自定义错误类型
协议:

public struct MyError: Error {
    let msg: String

}

extension MyError: LocalizedError {
    public var errorDescription: String? {
            return NSLocalizedString(msg, comment: "")
    }
}

例:

do {
    throw MyError(msg: "Something happened")
} catch let error {
    print(error.localizedDescription)
}

这将打印给定消息的本地化版本.
请注意,catch-clause中的错误是一般错误,因此
调用者不需要将其强制转换为具体的错误类型(甚至知道
抛出了哪种错误类型).

转载注明原文:swift – 自定义错误类型初始化程序 - 代码日志