Swift带关联值的枚举case布尔校验是否有简写写法?
带关联值枚举的布尔校验精简方案
你设想的.voice == mode ? true : false写法为什么不可行
- 语法层面直接报错:
Mode.voice是携带VoiceMode关联值的case,直接写不带关联值的.voice时,编译器无法推断完整的枚举上下文,会抛出类型不匹配的错误 - 逻辑层面不符合需求:就算你补全关联值写成
.voice(某固定VoiceMode值) == mode,这个判断是严格的全等比较,要求枚举值的case、关联值都完全和你写的固定值匹配才会返回true,根本达不到“只要属于voice分支就返回true”的校验目标,而且这个写法还要求枚举类型和它的关联值类型都提前实现Equatable协议才能用。
可用的精简写法(按推荐优先级排序)
所有写法和你原来的if-else逻辑完全等价,没有任何逻辑偏差:
- 全版本兼容、无额外依赖的最优写法
直接用is关键字判断枚举值是否属于某个case,完全不需要关心关联值的具体内容:
这个写法是目前最短、可读性最好的实现,不管你的关联值类型有没有实现Equatable,只要是判断case归属,就可以直接用。return mode is Mode.voice - 基于内置模式匹配运算符的等价写法
利用Swift内置的~=模式匹配运算符,把原来的if case判断直接转成布尔返回值:
因为右值return .voice ~= modemode的类型已经明确为Mode,编译器会自动把左值的.voice推断为Mode.voice,和switch、if case内部的判断逻辑完全一致。 - Swift 5.9+ 版本的可选写法
如果你的项目使用支持if作为表达式的Swift 5.9及以上版本,也可以精简原来的分支结构,但这个写法没有实际的简洁优势:return if case .voice = mode { true } else { false }
原代码的冗余点说明
你原来的实现本质上是把一个天然产生布尔结果的判断,拆成了两个固定的return分支。实际上if case 判断的结果本身就可以直接作为函数返回值,完全不需要单独写true/false的分支。
内容的提问来源于stack exchange,提问作者Fero
相关产品推荐
相关产品推荐

