声明一个方向的枚举,包含四个枚举值: 东/西/南/北.
Swift 的枚举成员在被创建时本身就是完备的值,这些值的类型是已经明确定义好的 Direction 类型. 不会像 Objective-C 一样被赋予一个默认的整型值。在上面的 Direction 例子中,east、west 、north、south不会被隐式地赋值为 0,1,2 和 3。
Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为原始值),则该值的类型可以是:字符串、字符、任意的整数值或浮点类型。
Swift的枚举类型提供了一个叫原始值(RawValues)的实现,它为枚举项提供了一个默认值,这个默认值在编译期间就是确定的。
通过原值值获取的枚举项是可选类型的,所以需要用if let 做一下判断。
未指定枚举值类型
隐式原始值
隐式原始值下枚举项使用系统的分配值:
显式原始值
隐式 + 显式原始值
这里使用了属性观察者,Swift里面的枚举更像一个对象,因此可以很方便的使用属性观察者对枚举值进行监听。
在 Swift 中,还可以定义这样的枚举类型,它的每一个枚举项都有一个附加信息,来扩充这个枚举项的信息表示,这又叫做关联值。
一定要学会使用关联值,这一点很重要。具体的使用后面的第九节会细说
通常情况下枚举是很容易进行相等判断的。一旦为枚举增加了关联值,Swift就没法正确的比较了,需要自己对该枚举实现 == 运算符。
借助 Comparable 协议,来实现枚举的比较。
遵守 CaseIterable 协议的swift枚举是可以遍历的,通过allCases获取所有的枚举成员.
app里面的接口地址,如果都放一起,命名或者寻找都不方便,可以用枚举的嵌套来设计。可以分散在多个文件中,方便维护和管理。
用枚举来管理系统里面的常量是一个不错的选择。
枚举中不能使用存储属性,但是可以使用计算属性,计算属性的内容是在枚举值或者枚举关联值中得到的。
在这里,可以认为枚举是一个类,introduced是一个成员方法,AppleDeivce.iPhone 就是一个AppleDeivce的实例,case们是它的属性。introduced里面的switch self,其实就是遍历这个匿名属性的所有场景,如iPad,iPhone等,然后根据不同的场景返回不同的值。
可以做枚举的自定义构造方法。
系统的打印协议
让枚举遵守这个协议
枚举可以进行扩展。可以将枚举中的case与method/protocol分隔开,阅读者可以快速消化枚举的内容。
设计一个网络类下的错误信息的处理功能。
在项目中经常使用 UserDefaults 来存储一下简单的用户信息。但是对 Key 的维护不会很方便。而且会想不起来。用枚举+结构体就能很好的解决这个问题。
这么设计APP的存储模块,是不是更有层级感,更加方便使用呢?
递归枚举是拥有另一个枚举作为枚举成员关联值的枚举。当编译器 *** 作递归枚举时必须插入间接寻址层。可以在声明枚举成员之前使用 indirect关键字来明确它是递归的。 也可以声明在整个枚举前,让所有的枚举成员都是递归的。
枚举在Java中是一个类 ,代表着类的一一列举。要想知道枚举具体的使用首先要先知道它的具体的 属性 和 方法 才可以。虽然说我们在实际应用中很少去关注它的属性和方法,而是更多的关注它的 特性 ,利用它本身的特性去满足各种有意思的场景。
由于上篇内容讲了我们自定义的枚举其实经过编译之后,实际继承的是lang包下的Enum类。虽然我们自定义的枚举类中可能存在不定义私有属性的情况,但继承的Enum类中自身就带有着两个属性,name属性、和ordinal属性。Enum类的源码
name为我们枚举值的名称,而ordinal这个词的意思是“序数”或者说“有顺序的”,其实就是序数。我们知道枚举所代表的就是包含一个以上枚举值的集合,既然是集合它就是有顺序的,而大多数我们使用的时候往往忽略了它的序数这个属性,似乎忘了枚举是枚举这件事了。
枚举中的序号是根据我们的枚举中显示的顺序决定的,其实是是语法糖转换时初始化枚举值时决定了枚举值的序数,枚举中,第一个枚举值的序数总是小于后面枚举值的序数,且序数是从0开始的。
接着上面讲的序数ordinal,针对序数我们先讲枚举的values()方法。
作为一个枚举值的集合,所必须要有的 *** 作肯定是遍历,这也是静态常量所没有的支持的。values()其实就是获取我们枚举值的数组:
虽然我们自定义的枚举类是可以使用这个方法的,但继承的Enum类却没有这个方法,其实values()这个方法是很特殊的一个方法,之前说过枚举是一种语法糖,在它真正编译后,就会产生values()这个方法,所以我们自定义的枚举类是可以使用这个方法的,而且values()方法所返回的其实是一个浅拷贝;
前面说到枚举有两个属性,name和ordinal,但实际上枚举只提供了根据name来获取具体枚举值的方法,却没有提供根据ordinal来获取具体枚举值的方法,但是values()方法也算是另外一种弥补了,根据values()得到的数据再根据ordinal序数获取具体的枚举值其实也是一样的效果。valueOf()方法就是那个根据name获取具体枚举值的方法,使用案例:
可选姿势为两种,一参和两参,具体看案例。
枚举是一种类型,用于定义变量,以限制变量的赋值 赋值时通过"枚举名.值"来取得相关枚举中的值public enum Season {
winter, spring, summer, fall
}
表示Season(季节)的值只能是枚举里面定义的 winter, spring, summer, fall(春夏秋冬)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)