如何简便判断枚举变量不等于带关联值的特定Case?
带关联值的Swift枚举状态判断方案
嘿,这个问题确实挺常见的——带关联值的枚举没法直接用!= .loaded来做非判断,不过除了你提到的switch和if case两种写法,还有个更清爽可复用的方案:给DisplayState枚举加个扩展,封装判断逻辑!
先回顾下我们的枚举和变量定义:
enum DisplayState{ case loading case loaded(ViewModel) case noResults case error } var displayState:DisplayState = .loading
解决方案:添加计算属性
我们可以给枚举扩展一个计算属性,直接返回当前是否处于非.loaded状态,这样后续代码里就能像用普通布尔值一样判断:
extension DisplayState { var isNotLoaded: Bool { switch self { case .loaded: return false default: return true } } }
之后使用的时候就超级简洁:
if displayState.isNotLoaded { // 执行你需要的操作 }
如果更习惯先判断是否是.loaded再取反,也可以这么写:
extension DisplayState { var isLoaded: Bool { if case .loaded = self { return true } return false } } // 调用时 if !displayState.isLoaded { // 执行操作 }
这种方式的好处是把状态判断的逻辑封装在枚举自身,不仅代码复用性拉满,而且调用时的可读性也比重复写switch或者if case模板代码强太多,后续如果枚举新增状态,只需要在扩展的switch里更新逻辑就行,不用改所有判断的地方。
内容的提问来源于stack exchange,提问作者Mark A. Donohoe
相关产品推荐
相关产品推荐

