Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有使用Swift'的技术原因;s的无案例枚举而不是真实案例?_Swift_Enums - Fatal编程技术网

是否有使用Swift'的技术原因;s的无案例枚举而不是真实案例?

是否有使用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

作为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 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建议


使用枚举,您有有限数量的实例,并且在编译时已知这些实例。优点是switch语句可以变得详尽无遗。如果您在编译时知道这些值,则尽可能创建枚举。如果您想扩展框架中定义的内容(如果您使用enum和rawV),则静态值只是一种变通方法值,那么所有的情况都必须是相同的类型。使用粗心枚举,每个常量都可以有不同的数据类型。@vacawama:“粗心枚举”很好!@MartinR,这不是弗洛伊德的错误,也不是拼写检查。我不是故意这么做的,哈哈!“粗心”是macOS自动更正的结果。我也是如此。千万不要随便使用枚举!:-)
“\(枚举名称)”
返回案例名称,而不是关联的字符串。所以OP会得到
“post”
,而不是
“post”
。对。我忘了,我通常在需要确切字符串时声明CustomStringConvertible。我编辑了我回答的那部分。