gpt4 book ai didi

swift - 自定义错误类型初始值设定项

转载 作者:搜寻专家 更新时间:2023-10-31 21:51:43 27 4
gpt4 key购买 nike

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

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


原因的简要总结:

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

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


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

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

主要问题是设置 NSLocalizedDescriptionKey 的唯一方法, 是通过初始化一个 NSError 对象。这样做需要转换为 Error类型(这是我试图避免的事情)。

我首先尝试使用 extension Error {... , 但不能使用初始值设定项。

如果我使用符合错误协议(protocol)(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(domain:... ,不是静态函数。


更 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协议(protocol):

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 子句中的 error 是一般的 Error,因此调用者不需要将其转换为具体的错误类型(甚至不知道抛出的错误类型)。

关于swift - 自定义错误类型初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44547486/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com