刚接触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,还是有另一个(技术)理由更喜欢第一个版本的第一个?
答案 0 :(得分:2)
最好在以下场景中创建包含案例的枚举:
在框架中定义struct
/ class
并且您想要扩展它以添加更多值。
使用此方法的示例是Notification.Name
Foundation
这一切都取决于你的意图
如果您事先知道这些值并且不会更改,那么请创建enum
如果无法做到这一点,请创建static
值。
如果您正在创建静态值,那么您就是妥协,因此您不必在enum
中使用它,您可以将其定义为struct
,以便意图更清晰
截至目前,有一条关于可扩展枚举的快速建议
答案 1 :(得分:0)
是否使用带有字符串值的枚举取决于您尝试解决的问题。如果需要一组无限制的字符串大小写,最好使用单个let rawValue: String
属性声明一个结构,对于已知值,声明已知值的静态实例。这就是Apple框架为NSNotification.Name之类的事情所做的事情。
关于enum rawValue的补充工具栏:使用:String
声明的枚举是自动CustomStringConvertible(类似于.toString()),使用"\(enum-name)"
而不是.rawValue,但是在枚举的情况下打印它,而不是字符串。当我需要时,我有时会实现CustomStringConvertible来打印rawValue。