SwiftUI中枚举实现Identifiable遇递归警告,求更优写法
问题分析与优化方案
无限递归的原因
你最初写的id计算属性里,return self.id是在反复调用这个计算属性本身——这里的self.id指向的是你正在定义的这个id属性,而非枚举关联值里的id。系统会不断触发这个getter的调用,直到栈溢出,因此Xcode弹出无限递归警告。
更简洁的实现方式
针对你觉得switch写法不够优雅的问题,有几种更优方案:
方案1:合并case的模式匹配
可以把两个case合并,直接提取关联值里的id,不用显式忽略其他参数:
var id: UUID { switch self { case let .rectangle(id: id), let .circle(id: id): return id } }
这种写法紧凑清晰,省去了重复的case逻辑。
方案2:重构枚举结构(推荐)
既然所有枚举case都需要id,不如把id从关联值中抽出来作为枚举的存储属性,从根源上简化代码:
enum ShapeEnum: Identifiable { let id: UUID = UUID() case rectangle(size: CGSize, color: Color) case circle(size: CGFloat, color: Color) }
这个方案的优势:
- 不用在每个case里重复定义
id关联值 - 直接满足
Identifiable协议要求,无需额外实现计算属性 - 逻辑更合理:
id是枚举实例的固有属性,而非某个case的附属关联值
内容的提问来源于stack exchange,提问作者swiftPunk
相关产品推荐
相关产品推荐

