有没有技术上的理由使用Swift的无壳枚举而不是真实案例?

时间:2018-03-22 11:09:56

标签: swift enums

刚接触Swift这就是我发现的:

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

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

在阅读this之后,使用无壳enum而不是struct的原因对我有意义,但这不是我对此感兴趣的事情。

拥有强大的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,但它会将枚举视为真实的枚举。来自C#我习惯在枚举值上使用.ToString()

这一切只是归结为个人偏好和Swift的惯例,使用无壳枚举而不是实际案例+ rawValue,还是有另一个(技术)理由更喜欢第一个版本的第一个?

2 个答案:

答案 0 :(得分:2)

Enum with cases

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

  • 互相排斥
  • 您在编译时知道的有限值集
  • 您是定义它的人(如果在框架中定义了枚举,则无法扩展它以添加更多案例)

枚举的优点是:

  • 由于值是有限集,因此您可以编写详尽的切换语句
  • 清洁代码

静态值:

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

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

中的Foundation

注意:

  • swift中的枚举非常强大
  • 枚举可以包含关联值
  • 枚举可以有其他功能。 (如果你定义了start,inProgress,finished等状态,你可以定义一个名为next的函数,它可以返回下一个状态.start.next()
  • 如果您处于价值不相互排斥的情况下,可能会使用值组合,而不是使用OptionSet

结论

  • 这一切都取决于你的意图

  • 如果您事先知道这些值并且不会更改,那么请创建enum

  • 如果无法做到这一点,请创建static值。

  • 如果您正在创建静态值,那么您就是妥协,因此您不必在enum中使用它,您可以将其定义为struct,以便意图更清晰

  • 截至目前,有一条关于可扩展枚举的快速建议

答案 1 :(得分:0)

是否使用带有字符串值的枚举取决于您尝试解决的问题。如果需要一组无限制的字符串大小写,最好使用单个let rawValue: String属性声明一个结构,对于已知值,声明已知值的静态实例。这就是Apple框架为NSNotification.Name之类的事情所做的事情。

关于enum rawValue的补充工具栏:使用:String声明的枚举是自动CustomStringConvertible(类似于.toString()),使用"\(enum-name)"而不是.rawValue,但是在枚举的情况下打印它,而不是字符串。当我需要时,我有时会实现CustomStringConvertible来打印rawValue。