编程iOS/Swift 开发者

什么是 Swift 中的 '枚举与关联值',以及何时应该使用这种结构而不是类或结构?

用 Hintsage AI 助手通过面试

答案。

Swift 中的 '枚举与关联值' 允许每个案例保存不同类型的个体值。这样的枚举实际上成为代数数据类型(Algebraic Data Type),非常适合表达有限个体的选项以及不同的附加数据。

使用这种结构:

  • 用于建模状态(例如,加载状态,操作结果:成功/错误等)
  • 当选项需要不同类型的额外参数时
  • 用于类型安全的模式和减少 switch 分支

代码示例:

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。


故事

在网络层中,仅使用类而不是枚举来传递错误。这导致错误列表迅速膨胀,出现重复的类型,并且维护变得复杂,而使用枚举的解决方案会使错误列表保持类型安全且集中的。