swift – 自定义模式匹配失败,“Enum case不是type的成员”

swift – 自定义模式匹配失败,“Enum case不是type的成员”,第1张

概述我正在尝试编写一个自定义模式匹配,让我打开错误并匹配错误代码.请参阅以下示例: enum ErrorCode: Int { case notSoDumb case dumbError}let myError = NSError(domain: "My domain", code: ErrorCode.dumbError.rawValue, userInfo: nil)func ~ 我正在尝试编写一个自定义模式匹配,让我打开错误并匹配错误代码.请参阅以下示例:

enum ErrorCode: Int {  case notSoDumb  case dumbError}let myError = NSError(domain: "My domain",code: ErrorCode.dumbError.rawValue,userInfo: nil)func ~=(pattern: ErrorCode,value: NSError) -> Bool {  return (ErrorCode(rawValue: value.code) == pattern)}switch myError {case ErrorCode.notSoDumb:  print("Not a dumb error")case ErrorCode.dumbError:  print("Super dumb error")default:  print("No matches!")}

我的switch语句中的第一个案例有一个Enum案例错误’notSoDumb’不是’NSError’类型的成员.如果我用整数替换ErrorCode枚举(并更新我的自定义〜=运算符以匹配Ints和NSErrors,一切正常.

解决方法 这是 a known bug与模式匹配的枚举案例;编译器错误地认为它始终使用 enumeration case pattern而不是 expression pattern.

在修复之前,强制编译器进入“表达式模式”的一种方法是首先绑定一个临时的case:

let notSoDumbErrorCode = ErrorCode.notSoDumblet dumbErrorCode = ErrorCode.dumbErrorswitch myError {case notSoDumbErrorCode:  print("Not a dumb error")case dumbErrorCode:  print("Super dumb error")default:  print("No matches!")}

然而,这非常笨重.一个更好的解决方法是使用带静态成员而不是枚举的结构:

import Foundationstruct ErrorCode : Equatable,RawRepresentable {  let rawValue: Int  static let notSoDumb = ErrorCode(rawValue: 0)  static let dumbError = ErrorCode(rawValue: 1)}let myError = NSError(domain: "My domain",value: NSError) -> Bool {  return value.code == pattern.rawValue}switch myError {case ErrorCode.notSoDumb:  print("Not a dumb error")case ErrorCode.dumbError:  print("Super dumb error")default:  print("No matches!")}

这也使您可以在以后通过扩展添加其他错误代码(它的行为更像是一个打开的枚举).虽然它确实从init(rawValue :)中删除了验证,这可能是也可能不是(你可以总是实现自己的init?(rawValue :)).

或者,as you say in your comment,您可以坚持使用枚举,但在模式匹配时使用中间函数调用以强制编译器进入“表达式模式”:

enum ErrorCode : Int {  case notSoDumb  case dumbError}// ...func IDentity<T>(_ t: T) -> T { return t }switch myError {case IDentity(ErrorCode.notSoDumb):  print("Not a dumb error")case IDentity(ErrorCode.dumbError):  print("Super dumb error")default:  print("No matches!")}
总结

以上是内存溢出为你收集整理的swift – 自定义模式匹配失败,“Enum case不是type的成员”全部内容,希望文章能够帮你解决swift – 自定义模式匹配失败,“Enum case不是type的成员”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1008075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存