使用 "enum" 关键字来创建一个枚举。就像类和所有其他的命名类型,枚举可以有方法和它绑定在一起。例:

swift在默认情况下从0开始分配原始值(raw value),同时每分配一个值,自动加1。但是,你也可以改变这一行为,通过明确的给各个枚举选项赋值。在示例中,Ace被明确的给了一个初始值1,而剩余的原始值,按顺序分配。你也可以使用字符串或者是浮点数作为原始值的类型。使用 "rawValue" 属性来获取枚举选项的原始值。(如果这里,Rank的rawValue type是字符串的话,那么Rank.three.rawValue就是three)
使用 init?(rawVaklue:)构造器来将一个初始值做成一个枚举。例:

一个枚举中的枚举选项的值,是一个实际存在的值,而不只是将让他们的原始值换种方式来写。实际上,假如有些位置没有有意义的原始值,你并不一定要提供一个(原始值)。例:

注意,在上述的两种指向 "hearts" 枚举选项的方式中:当要给参数赋 ‘hearts’ 的值时,使用的是 Suit.hearts 这一全名(full name),因为常量并没有明确指定一个类型。在switch中,枚举选项使用的是 '.hearts' ,因为self 的值是已知的。只要数值类型是已知的(或者是可推断的)那么你就可以使用 .xxx 缩写,省略枚举名。
如果一个枚举有原始值,那些(原始)值将被确定为声明的一部分,这意味着,任何一个指定了枚举选项的枚举实例(例:Rank.ace),总是有相同的原始值。另一种给枚举选项设置原始值的方法,是将原始值和枚举选项关联起来。这些原始值会在你创建枚举实例的时候被确定。而且不同的枚举实例,即便选项相同,但是原始值不同(两个实例都是Rank.ace,但是原始值不同)。你可以将这种原始值关联的行为,理解成每个枚举实例存储了(不同)属性。例如:思考如下情况,向服务器请求日出和日落的时间。服务器要么返回请求的信息,要么返回错误描述。例:

这里还有一个拆包的过程,使用 "let" 将 枚举实例(success)进行拆包。这么一来,相对于 C 和 OC中的枚举,swift 中的枚举能包含更多的信息,更加灵活。
注意下,日出和日落的时间,在switch case 条件判断语句中,是如何匹配条件,然后被取出的。
使用 "struct" 关键字来创建一个结构体。结构体支持许多同"类"一样的功能(same behaviors as class),(譬如)包含方法和构造器。例:

类和结构体有一个非常重要的不从点 —— 结构体在代码中传递时总是被拷贝,而类在代码中传递时,总是被引用。这里,牵扯到两种类型的数据结构。结构体是数值类型的,而类是引用类型的。数值类型的变量或者说实例,当作为右值赋值给其他变量时,总是用的拷贝。譬如说,int a = 1,int b = a,这个时候,b就等于2,但是紧接着写一句 a = 4的话,那么a就是4,但是b仍旧是2。原因是int型是数值类型,b = a这一句话中,a的值实际上是拷贝给了b,所以之后修改a的话,b不受影响。但是,如果是引用类型的话,例如:

可见,类是引用类型,在 b = a这一句中,实际上,此时a,b指向的是同一个实例,而这个实例的引用计数是2。所以,修改了a之后,b的值也会发生变化。
网友评论