使用 Swift 的无大小写枚举而不是实际情况是否有技术原因?

2024-05-06

作为 Swift 新手,我发现:

enum HttpMethod {
  static let post = "POST"
  static let get = "GET"
}

// can assign to string property.
request.httpMethod = HttpMethod.post // --> "POST"

使用无壳的原因enum而不是一个struct读后对我来说很有意义this https://stackoverflow.com/questions/38585344/swift-constants-struct-or-enum/39005493#39005493但这不是我感兴趣的事情。

拥有强大的 C# 背景,这就是我实现它的方式:

enum HttpMethod: String {
  case post = "POST"
  case get = "GET"
}

// I'd even consider this alternatively:
enum HttpMethod: String {
  case post
  case get
}

// Must retrieve string value
request.httpMethod = HttpMethod.post.rawValue // --> "POST" or "post"

第二个版本需要使用rawValue但它将枚举视为real枚举。来自 C# 我习惯使用.ToString()关于枚举值。

这一切是否只是取决于个人喜好和 Swift 的约定,即使用无大小写枚举而不是实际大小写 + rawValue,或者是否还有其他(技术)原因更喜欢第一个版本而不是第二个版本?


带案例的枚举

在以下场景中,最好创建一个包含案例的枚举:

  • 这是互斥的
  • 您在编译时已知的有限值集
  • 您是定义它的人(如果在框架中定义了枚举,您将无法扩展它以添加更多情况)

枚举的优点是:

  • 由于值是有限集,因此您可以编写详尽的 switch 语句
  • 更干净的代码

静态值:

When a struct / class是在框架中定义的,并且您想要扩展它以添加更多值。

使用此方法的示例是Notification.Name in Foundation

Note:

  • Swift 中的枚举非常强大
  • 枚举可以有关联的值
  • 枚举可以有其他功能。 (如果您正在定义像开始、进行中、完成这样的状态,您可以定义一个名为 next 的函数,它可以返回下一个状态。start.next()
  • 如果您处于值不互斥的情况(例如可以是值的组合),则使用 OptionSet

结论

  • 这完全取决于你的意图

  • 如果您事先知道这些值并且它们不会改变,那么创建一个enum

  • 如果不可能,那么创建static values.

  • 如果您正在创建静态值,那么您就是在妥协,因此您不必在enum,你可以将它定义为struct以便意图更加明确。

  • 截至目前,有一个关于可扩展枚举的快速提案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Swift 的无大小写枚举而不是实际情况是否有技术原因? 的相关文章

随机推荐