Swift教程之枚举类型详解

论坛 期权论坛 脚本     
niminba   2021-5-23 03:43   1048   0

枚举定义了一个常用的具有相关性的一组数据,并在你的代码中以一个安全的方式使用它们。

如果你熟悉C语言,你就会知道,C语言中的枚举指定相关名称为一组整数值。在Swift中枚举更为灵活,不必为枚举的每个成员提供一个值。如果一个值(被称为“原始”的值)被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或者任何整数或浮点类型的值。

另外,枚举成员可以指定任何类型,每个成员都可以存储的不同的相关值,就像其他语言中使用集合或变体。你还可以定义一组通用的相关成员为一个枚举,每一种都有不同的一组与它相关的适当类型的值的一部分。

在Swift中枚举类型是最重要的类型。它采用了很多以前只有类才具有的特性,如计算性能,以提供有关枚举的当前值的更多信息,方法和实例方法提供的功能相关的枚举表示的值传统上支持的许多功能。枚举也可以定义初始化,以提供一个初始成员值;可以在原有基础上扩展扩大它们的功能;并使用协议来提供标准功能。

欲了解更多有关这些功能,请参见Properties, Methods, Initialization, Extensions, Protocols

1、枚举语法

使用枚举enum关键词并把他们的整个定义在一对大括号内:

复制代码 代码如下:

enum SomeEnumeration {
    // enumeration definition goes here
}


下面是一个指南针的四个点一个例子:

复制代码 代码如下:
 
enum CompassPoint {
    case North
    case South
    case East
    case West
}


在枚举中定义的值(如North,South,East和West)是枚举的成员值(或成员)。这个例子里case关键字表示成员值一条新的分支将被定义。

Note

不像C和Objective-C,Swift枚举成员在创建时不分配默认整数值。在上面的例子CompassPoints中North,South,Eath,West不等于隐含0,1,2和3,而是一种与CompassPoint明确被定义的类型却各不相同的值。

多个成员的值可以出现在一行上,用逗号分隔:

复制代码 代码如下:
 
enum Planet {
    case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

每个枚举定义中定义了一个全新的类型。像其他Swift的类型,它们的名称(如CompassPoint和Planet)应为大写字母。给枚举类型单数而不是复数的名字,这样理解起来更加容易如:

复制代码 代码如下:

var directionToHead = CompassPoint.West

使用directionToHead的类型时,用CompassPoint的一个可能值初始化的推断。一旦directionToHead被声明为一个CompassPoint,您可以将其设置为使用更短的.语法而不用再书写枚举CompassPoint值本身:

复制代码 代码如下:

directionToHead = .East

directionToHead的类型是已知的,所以你可以在设定它的值时,不写该类型。使用类型明确的枚举值可以让代码具有更好的可读性。

2、匹配枚举值与switch语句

你可以使用单个枚举值匹配switch语句:

复制代码 代码如下:

directionToHead = .South
switch directionToHead {
case .North:
    println("Lots of planets have a north")
case .South:
    println("Watch out for penguins")
case .East:
    println("Where the sun rises")
case .West:
    println("Where the skies are blue")
}
// prints "Watch out for penguins"


你可以理解这段代码:

“考虑directionToHead的价值。当它等于North,打印“Lots of planets have a north”。当它等于South,打印“Watch out for penguins”等等。

正如控制流所描述,Switch语句考虑枚举的成员,如果省略了West时,这段代码无法编译,因为它没有考虑CompassPoint成员的完整性。Switch语句要求全面性确保枚举成员,避免不小心漏掉情况发生。

当它不需要为每一个枚9=@4(4(:/4(rSvjzkj"CFc b;c B3z/jSSzk"CFc>.#:/;3r'n3jz/4(bc :/jM %'B7zk"CFcj4(ф7" 4)M %% 4(Q4(14( I4)4(r/k_z/jzk>iM %% SjM %':"_ __J3_j>?4(Σ?/n3S:/jS#rkzk?M %' ;&疺kjzk"CFcj:/bn3j "o~;zkj?"[>c?jZ"CFcjS3?kj^g>bB3j4(:/b__[V"[ z/ ?:/jzkRb; VR:/ zszk"CFcr'*K{4(v"_jb2[j^r}Azk/VV?jbj?4(ф7" 4)A%Ё4(5Y5)MU94)4+*K{?FvAйYr$j:/:4(IZWzk"CFcj:/4(ф7" 4)ЁɑйI4(ɑ4(4+zkjIZWvWn"&疺kj:/"CFc "Ujk/4(ф7" 4)ЁAйI4(AЁAИAйU4(4+3v{&r'>%27jbB n IZW>'jzk"CFc rvjAz-A[s>'jAw4( zsWn"jkI>'jAb^4(ф7" 4)ЁQ4)ЁAйIQ4(эAЁ4(4(54(4(9Ё4(4)4(QЁЁЁpQ4)QЁЁЁ4(4+2RAAйIvW'nB!A>%AnB#vA:/7"jbBr%"R&3

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP