是否可以在 Swift 中设置从 NSError 到自定义错误的隐式转换?
Is it Possible To Set Up Implicit Conversion from NSError to Custom Error in Swift?
从 NSHipster 阅读以下内容让我想知道 NSError 以及是否可以设置一些东西以便 NSError 隐式转换为自定义错误类型。
我创建了以下内容:
protocol NSErrorConvertible {
init(error: NSError)
}
还有这个
struct CustomError: NSErrorConvertible {
var message: String
var code: String?
init(error: NSError) {
code = String(error.code)
message = error.localizedDescription
}
}
但是,我没有看到任何可以进行隐式转换的东西。
我知道 C++ 中存在这样一个功能,它只有一个参数的构造函数。 Swift using protocols 或其他东西中是否有类似的东西可用?
没有。 Swift 通常通过设计避免隐式转换。他们甚至拿走了我们用来实现它的工具 (__conversion
),因为它给编译器和注入细微的错误带来了很多麻烦。隐式转换引入重要的小差异是很常见的。程序员考虑这些事情而不是求助于魔术通常很重要。这一直是 C 和 C++ 中错误的长期来源。
如果您在 error
之前添加一个 _
(因此不需要标签),那么显式转换是微不足道的:
init(_ error: NSError) { ... }
...
CustomError(error)
另见 Does Swift support implicit conversion?
从 NSHipster 阅读以下内容让我想知道 NSError 以及是否可以设置一些东西以便 NSError 隐式转换为自定义错误类型。
我创建了以下内容:
protocol NSErrorConvertible {
init(error: NSError)
}
还有这个
struct CustomError: NSErrorConvertible {
var message: String
var code: String?
init(error: NSError) {
code = String(error.code)
message = error.localizedDescription
}
}
但是,我没有看到任何可以进行隐式转换的东西。
我知道 C++ 中存在这样一个功能,它只有一个参数的构造函数。 Swift using protocols 或其他东西中是否有类似的东西可用?
没有。 Swift 通常通过设计避免隐式转换。他们甚至拿走了我们用来实现它的工具 (__conversion
),因为它给编译器和注入细微的错误带来了很多麻烦。隐式转换引入重要的小差异是很常见的。程序员考虑这些事情而不是求助于魔术通常很重要。这一直是 C 和 C++ 中错误的长期来源。
如果您在 error
之前添加一个 _
(因此不需要标签),那么显式转换是微不足道的:
init(_ error: NSError) { ... }
...
CustomError(error)
另见 Does Swift support implicit conversion?