gpt4 book ai didi

swift - 使用 Swift 的无大小写枚举而不是真实大小写有技术原因吗?

转载 作者:可可西里 更新时间:2023-11-01 00:39:16 25 4
gpt4 key购买 nike

作为 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 的惯例,还是有其他(技术)原因更喜欢第一个版本而不是第二个版本?

最佳答案

用例枚举

在以下情况下,最好创建一个带有 case 的枚举:

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

枚举的优点是:

  • 由于值是有限集,您可以编写详尽的 switch 语句
  • 更简洁的代码

静态值:

当一个 struct/class 被定义在一个框架中并且你想要扩展它来添加更多的值时。

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

注意事项:

  • swift 中的枚举非常强大
  • 枚举可以有关联值
  • 枚举可以有其他功能。 (如果你正在定义开始、进行中、完成等状态,你可以定义一个名为 next 的函数,它可以返回下一个状态。start.next()
  • 如果您处于值不互斥的场景中,比如它可以是值的组合,那么请改用 OptionSet

结论

  • 这完全取决于您的意图

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

  • 如果那不可能,则创建static 值。

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

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

关于swift - 使用 Swift 的无大小写枚举而不是真实大小写有技术原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49427144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com