Swift枚举判断单行赋值报错要求Entry遵循Equatable的解决方法
问题原因
报错的核心原因是你定义的Entry枚举没有遵循Equatable协议,Swift默认不允许未遵循该协议的类型使用==做相等判断。你原有if分支写法未报错,是因为旧版本Swift在if条件的可选值上下文下未做严格的Equatable校验,直接将比较结果赋值给布尔变量时会触发严格校验,所以出现报错。
解决方案
可根据你的实际需求选择对应方案:
方案1:完全对齐原有逻辑,无枚举修改成本
原有if分支的逻辑是仅当条件成立时才把isButtonValidate设为true,条件不成立时变量保留原有值,你可以直接把代码压缩为单行if写法,不需要修改枚举定义,也不会触发Equatable报错:
if Session.shared.input?.entry == .confirm { isButtonValidate = true }
如果你的Entry枚举带有相关联值,改用case匹配的写法即可,完全不需要Equatable支持:
if case .confirm = Session.shared.input?.entry { isButtonValidate = true }
方案2:支持直接单行赋值,需修改枚举定义
如果你的需求是条件不成立时直接把isButtonValidate设为false(和原有if逻辑不同,请注意区分),只需要给Entry枚举添加Equatable协议遵循即可。Swift 4.2及以上版本会自动为枚举合成Equatable实现,不需要你手写额外代码:
// 修改枚举定义,添加Equatable声明 enum Entry: Equatable { case confirm // 其余case即使有关联值,只要关联值的类型都遵循Equatable,就会自动合成相等判断逻辑 case other(type: Int) }
修改后你写的单行赋值代码就可以正常运行:
isButtonValidate = Session.shared.input?.entry == .confirm
逻辑差异说明
- 方案1的单行if和你的原有代码逻辑完全一致,仅修改条件成立时的变量值,不会覆盖原有值
- 方案2的直接赋值会不管条件是否成立都覆盖变量的布尔值,条件不成立时会被设为false
内容的提问来源于stack exchange,提问作者New iOS Dev
相关产品推荐
相关产品推荐

