是否有使用Swift'的技术原因;s的无案例枚举而不是真实案例?
作为Swift的新手,我发现:是否有使用Swift'的技术原因;s的无案例枚举而不是真实案例?,swift,enums,Swift,Enums,作为Swift的新手,我发现: enum HttpMethod { static let post = "POST" static let get = "GET" } // can assign to string property. request.httpMethod = HttpMethod.post // --> "POST" 阅读后,我觉得使用无大小写的enum而不是struct的原因是有道理的,但这不是我感兴趣的东西 拥有强大的C#背景,我将如何实现它: enum
enum HttpMethod {
static let post = "POST"
static let get = "GET"
}
// can assign to string property.
request.httpMethod = HttpMethod.post // --> "POST"
阅读后,我觉得使用无大小写的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,还是有另一个(技术)原因更倾向于使用第一个版本而不是第二个版本?是否使用带有字符串值的枚举取决于您试图解决的问题。如果需要一组无界的字符串大小写,最好使用单个
let rawValue:string
属性声明一个结构,对于已知值,最好声明已知值的静态实例。这就是苹果框架为类似的事情所做的
关于enum rawValue的侧栏:使用:String
声明的enum会自动自定义StringConvertible(类似于.toString()),使用“\(enum name)”
,而不是.rawValue,但会在enum而不是字符串的情况下打印它。有时我会实现CustomStringConvertible,以便在需要时打印原始值。Enum with cases
最好在以下场景中创建包含案例的枚举:
- 这是相互排斥的
- 编译时知道的有限值集
- 您是定义它的人(如果在框架中定义了枚举,您将无法扩展它以添加更多案例)
- 由于这些值是一个有限集,因此可以编写详尽的switch语句
- 清洁代码
结构
/类
时,您希望对其进行扩展以添加更多值
使用此方法的示例是Foundation
中的Notification.Name
注:
- swift中的枚举功能非常强大
- 枚举可以有关联的值
- 枚举可以具有其他功能。(如果您定义的是start、inProgress、finished等状态,则可以定义一个名为next的函数,该函数可以返回next state.start.next()
- 如果您所处的场景中的值不是互斥的,那么可以使用OptionSet来代替
- 这完全取决于你的意图
- 如果您事先知道这些值,并且它们不会更改,则创建一个
enum
- 如果不可能,则创建
静态
值
- 如果您创建的是静态值,那么您就是在折衷,这样就不必在
枚举中使用它了,您可以将它定义为
,这样目的就更清楚了结构
- 现在,有一个关于可扩展枚举的swift建议
“\(枚举名称)”
返回案例名称,而不是关联的字符串。所以OP会得到“post”
,而不是“post”
。对。我忘了,我通常在需要确切字符串时声明CustomStringConvertible。我编辑了我回答的那部分。