Swift枚举关联值问题:changeAccountConfirmDialog需Author参数报错及实现咨询
Swift枚举带关联值时的属性实现方案
原代码与问题
原枚举代码如下:
internal enum PlayBroadcasterDialogLiveType: Equatable { case error case exit case liveOnOtherDevice case stopped case paused case freezed case reconnected case disconnected case liveIsModerate case changeAccountConfirmDialog(Author) internal var shouldExitToLiveReport: Bool { return self != .liveOnOtherDevice && self != .disconnected && self != .error && !isLiveModerate && self != .freezed && self != .changeAccountConfirmDialog } }
报错原因:changeAccountConfirmDialog是带关联值的枚举case,直接用self != .changeAccountConfirmDialog会触发编译错误——该case必须传入Author类型参数,无法直接进行无参数的相等性判断。
解决方案
方案一:使用Switch语句(推荐,可读性更高)
通过switch枚举所有case,明确列出不需要触发退出的场景,其余场景返回true:
internal enum PlayBroadcasterDialogLiveType: Equatable { // 保持原有case定义不变 case error case exit case liveOnOtherDevice case stopped case paused case freezed case reconnected case disconnected case liveIsModerate case changeAccountConfirmDialog(Author) internal var shouldExitToLiveReport: Bool { switch self { // 所有不需要退出到直播报告的case case .liveOnOtherDevice, .disconnected, .error, .freezed, .liveIsModerate, .changeAccountConfirmDialog: return false // 其余case均返回true default: return true } } }
方案二:使用模式匹配修改原条件判断
在原条件逻辑中,用case .changeAccountConfirmDialog(_)匹配任意关联值的该case,同时统一liveIsModerate的判断方式:
internal var shouldExitToLiveReport: Bool { return self != .liveOnOtherDevice && self != .disconnected && self != .error && self != .liveIsModerate && self != .freezed && !(case .changeAccountConfirmDialog(_) = self) }
说明
- Switch方案更适合枚举case较多的场景,逻辑清晰,后期维护成本更低。
- 模式匹配方案可以保留原有代码的条件结构,但可读性稍弱,适合需要维持原有代码风格的场景。
内容的提问来源于stack exchange,提问作者Rajat Dhasmana
相关产品推荐
相关产品推荐

