swift - 使用 'case' 模式匹配直接返回结果
问题描述
这是我的代码:
enum ServerResponse {
case ok, error(Error), rawError(String), resend
func isOk(response: ServerResponse) -> Bool {
case ServerResponse.ok = response
}
}
它不会编译并出现以下错误:
“case”标签只能出现在“switch”语句中
这很奇怪,因为这是允许的:
func isOk(response: ServerResponse) -> Bool {
if case ServerResponse.ok = response {
return true
}
return false
}
但正如我们所看到的,它花费了我额外的代码行。我希望它能够工作,因为在 Swift 中,只允许使用布尔值。文档说:
if 语句中的任何条件的值必须是 Bool 类型或桥接到 Bool 的类型
这意味着该行应该评估为布尔值,因为上面的代码可以编译,并且代码行是 if 语句中的条件:
case ServerResponse.ok = response
为什么我不能使用它直接在方法中返回布尔值(问题中的第一个代码)?是否有任何 oneliner 可以检查给定的枚举属性是否是给定的枚举案例?
解决方案
您只需要使您的enum
符合Equatable
,那么您甚至不需要案例,您可以简单地使用==
来检查您的enum
变量是否属于具体案例。
enum ServerResponse {
case ok, error(Error), rawError(String), resend
func isOk(response: ServerResponse) -> Bool {
return response == .ok
}
}
extension ServerResponse: Equatable {
static func == (lhs: ServerResponse, rhs: ServerResponse) -> Bool {
switch (lhs, rhs) {
case ( .ok, .ok):
return true
case (.resend, .resend):
return true
case (.rawError(let string), .rawError(let otherString)):
return string == otherString
case (.error(_), .error(_)):
return true
default:
return false
}
}
}
与您的问题无关,但定义isOk
为实例方法并使其接受输入参数是没有意义的。要么不传入,而是response
简单地使用self == .ok
或使函数成为类型方法,然后传入值。
实例方法:
func isOk() -> Bool {
return self == .ok
}
然后这样称呼它:ServerResponse.ok.isOk()
类型方法:
static func isOk(response: ServerResponse) -> Bool {
return response == .ok
}
然后这样称呼它:ServerResponse.isOk(response: .resend)
推荐阅读
- r - 渲染PDF时如何在R Markdown中进行多列布局?
- deployment - Next.js 中的 `next export` 和 `next build` 有什么区别?
- python - ImportError:numpy.core.multiarray 使用 pytorch 时导入失败
- python - 如何在不和谐 python 机器人中制作画布个人资料卡?
- ios - Instagram 小部件在 iOS 中无法正确加载
- javascript - UnhandledPromiseRejectionWarning:TypeError:无法设置未定义的属性“值”
- python - Pandas Dataframe 如何在特定行之前提取数据行?
- amazon-web-services - Kubernetes,AWS:服务为每个服务创建额外的安全组
- javascript - 如何附加nodejs sequelize json字段的模型列表
- php - 自动更新数据库列 Laravel 中的值