Swift 中的 '枚举与关联值' 允许每个案例保存不同类型的个体值。这样的枚举实际上成为代数数据类型(Algebraic Data Type),非常适合表达有限个体的选项以及不同的附加数据。
使用这种结构:
代码示例:
enum NetworkResult { case success(data: Data) case failure(error: Error) } func handle(result: NetworkResult) { switch result { case .success(let data): print("获取到的数据: \(data)") case .failure(let error): print("错误: \(error.localizedDescription)") } }
可以在枚举内部创建枚举(嵌套枚举)吗,为什么这可能有用?
答案: 是的,Swift 支持嵌套枚举。这对于建模嵌套状态和确保范围非常方便。例如:
enum PaymentStatus { enum ErrorType { case declined, timeout } case success(amount: Double) case failure(type: ErrorType) }
故事
在项目中实现了通过带有关联值的枚举建模的复杂请求状态模型,但在添加 switch 中的新案例时没有实现 default 处理。这导致了静默错误,这些错误在运行时难以捕捉,而不是在编译阶段。
故事
开发者试图直接将带有关联值的枚举序列化为 JSON。如果没有为每个案例手动支持 Codable,应用程序在解码时会丢失数据,这会在与服务器同步时导致严重的 bug。
故事
在网络层中,仅使用类而不是枚举来传递错误。这导致错误列表迅速膨胀,出现重复的类型,并且维护变得复杂,而使用枚举的解决方案会使错误列表保持类型安全且集中的。