首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有技术上的理由使用斯威夫特的无案例枚举而不是真实的案例?

是否有技术上的理由使用斯威夫特的无案例枚举而不是真实的案例?
EN

Stack Overflow用户
提问于 2018-03-22 11:09:55
回答 3查看 4.1K关注 0票数 4

作为斯威夫特的新手,这就是我发现的:

代码语言:javascript
复制
enum HttpMethod {
  static let post = "POST"
  static let get = "GET"
}

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

在阅读了enum之后,使用没有案例的struct而不是struct的原因对我来说是有意义的,但这并不是我感兴趣的东西。

有一个强大的C#背景--这就是我实现它的方法:

代码语言:javascript
复制
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()

这只是个人偏好和斯威夫特使用无案例枚举而不是实际案例+ rawValue的惯例,还是还有其他(技术)原因更倾向于第一个版本而不是第二个版本?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-22 11:53:04

案卷

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

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

enum的优势是:

  • 由于这些值是有限的,所以可以编写详尽的开关语句。
  • 清洁代码

静态值:

当在框架中定义了struct / class并希望对其进行扩展以添加更多的值时。

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

注意:

  • 敏捷的枚举是相当强大的。
  • 枚举可以具有关联的值。
  • 枚举可以具有其他功能。(如果您正在定义像start,inProgress,finished这样的状态,您可以定义一个名为next的函数,它可以返回下一个状态。start.next()
  • 如果您所处的场景中的值不是相互排斥的,就像它可能是值的组合一样,那么使用OptionSet代替。

结论

  • 这完全取决于你的意图
  • 如果您知道前面的值,并且它们不会更改,那么创建一个enum
  • 如果这是不可能的,那么创建static值。
  • 如果您正在创建静态值,则需要折衷,这样您就不必在enum中使用它,您可以将其定义为struct,以便更清楚地说明其意图。
  • 这是到目前为止,有一个迅速的建议,可扩展的枚举。
票数 7
EN

Stack Overflow用户

发布于 2018-03-22 11:48:20

是否对字符串值使用枚举取决于您要解决的问题。如果需要一组无界字符串情况,最好使用单个let rawValue: String属性声明一个结构,对于已知值,最好声明已知值的静态实例。这就是苹果框架对NSNotification.Name这样的东西所做的事情。

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

票数 0
EN

Stack Overflow用户

发布于 2022-11-07 19:26:02

我确实同意这样做比不适用于案例要好。无实例枚举用于存储常量的另一个原因是。决定如何存储常量可能会变得很棘手。无实例枚举提供了一种无法实例化/构造的类型。它只是列出静态常量属性的一种方法,可以像枚举一样访问这些属性。

代码语言:javascript
复制
enum Constants {
    
    static let dateFormat: String = "dd.MM.yy"
    static let timeFormat: String = "hh:mm:ss a"
    static let defaultLocationCoordinates: CLLocationCoordinate2D = CLLocationCoordinate2DMake(-26.204103, 28.047305)
}

class Test {
    static func echo() {
        print("\(Constants.dateFormat)")
        print("\(Constants.timeFormat)")
        print("\(Constants.defaultLocationCoordinates)")
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49427144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档