美文网首页
Swift5-外行零基础入门_13-枚举

Swift5-外行零基础入门_13-枚举

作者: DavidShawn | 来源:发表于2020-12-25 22:56 被阅读0次

枚举

什么是枚举?

还是说回到数据类型。我们在表达某个事物的时候,可以用数字,文字进行描述;可以用流程语句来描述一段逻辑;还可以用函数,来打包某件事,用于更加方便的调用。
某些事物的性质,可以用有限的列举来表达,比如
家具的材质:木,金属,石材
汽车的品牌:比亚迪,特斯拉
为了更方便的描述事物,我们引入了枚举的概念。

枚举的形式

在下面这些例子中,我们使用了枚举:

// 列出我们经常吃的一些水果。
enum Fruit {
    case apple
    case banana
    case orange
}
// 列出星期一到星期天
enum WeekDay {
    case Monday
    case Tuesday
    case Wednesday
    case Thursday
    case Friday
    case Saturday
    case Sunday
}

enum是关键词,代表要创建一个枚举;Fruit枚举的名称,首字母大写;大括号括起枚举定义case关键词定义的是枚举成员值

这里有个概念,叫做一等类型,比如IntString等基本类型,他们可以作为参数,可以作为返回值。我们学过的函数也是一等类型,枚举enum也是一等类型。

枚举的访问

  • 访问枚举中的某个成员值
    使用枚举名.成员值的形式,可以访问到枚举中的具体成员值。
enum Fruit {
    case apple
    case banana
    case orange
}
var a = Fruit.apple
a // apple

我们打印a的数据类型看看。

print(type(of: a))
// Fruit

a的数据类型是Fruit,有点像函数,是一个自定义的数据类型。
我们还可以给a赋值为其他的成员值。

var a = Fruit.orange
a // orange

a的值就变成了orange
Swift语言提供了简写的方式赋值。

a = .banana
print(a)  // banana
  • 遍历枚举的成员值
    既然枚举是一串数据,我们应该就可以使用for-in语句进行遍历访问,但是直接用for i in Fruit这种语句是无法进行遍历访问的,因为Fruit并不是一个集合值。
    我们需要加一些装饰语句。首先,定义枚举的时候,要声明遵循CaseIterable协议(协议的概念我们后面再说),然后在遍历的时候,要使用.allCases表示枚举成员的集合。表达如下:
enum Fruit: CaseIterable {
    case apple
    case banana
    case orange
}
for i in Fruit.allCases {
    print(i)
}
//  apple banana orange

枚举的应用

  • 结合switch
    配合switch语句,我们可以根据枚举的不同成员值,匹配出不同的动作。
var a = Fruit.apple

switch a {
case .apple:
    print("我喜欢吃苹果。")
case .banana:
    print("我喜欢吃香蕉。")
case .orange:
    print("我喜欢吃橘子。")
}
// 我喜欢吃苹果。

这里需要注意的是,switch需要将枚举中的成员值列举完全,如果不需要列举完全,可以搭配使用default。

var a = Fruit.orange

switch a {
case .apple:
    print("我喜欢吃苹果。")
case .banana:
    print("我喜欢吃香蕉。")
default:
    print("我喜欢吃其他水果。")
}
// 我喜欢吃其他水果。
  • 关联值
    枚举看起来有很多成员值,但是同一时间,枚举只能呈现一个值。
    如上面的例子中,如果a的值是苹果,switch判断出来的执行语句就是“我喜欢吃苹果。”
    利用这个特性,我们可以给枚举先定义一个框架,然后再赋值。
    举例,我想选一种方式,与客户王总沟通业务,有电话沟通和邮件沟通两种方式:
enum Communication {
    case phone(Int)
    case email(String)
}

我先定义了一个枚举框架,这个框架中没有给任何的赋值,当我决定时,我再进行赋值:

var wangzong = Communication.phone(13888888888)
// 或者是
var wangzong = Communication.email(wangzong@163.com)

那么,如何取出这个值呢,还是用switch

switch wangzong {
case .phone(let phoneNumner):
    print("打电话(\(phoneNumner))给王总。")
case .email(let emailAddress):
    print("发邮件(\(emailAddress))给王总。")
}

这是我理解的关联值的概念。

拓展的概念和应用

  • 原始值
    我们看下面这个枚举:
enum tranlate: String {
    case apple = "苹果"
    case banana = "香蕉"
    case orange = "橘子"
}

=后面连接的字符"苹果"就是成员值的原始值。要注意的是,前面需要指定数据类型,后面的原始值也要遵守这个指定的数据类型。
如何访问这个原始值呢?

let word = tranlate.apple.rawValue
// 苹果

这里,我们使用了.rawValue访问到了原始值。
原始值,其实有默认值。我们继续看下面的例子:

enum tranlate: Int {
    case apple
    case banana
    case orange
}
let word = tranlate.orange.rawValue
// 2

如果指定原始值为Int,但是后面却没有指定,默认就是从0开始,所以orange的原始值是2
如果指定原始值为String呢?

enum tranlate: String {
    case apple
    case banana
    case orange
}
let word = tranlate.orange.rawValue
// orange

这是,默认是原始值就是成员值本身。

  • 递归
    枚举的递归需要用到函数的概念。
    待补充………………

相关文章

网友评论

      本文标题:Swift5-外行零基础入门_13-枚举

      本文链接:https://www.haomeiwen.com/subject/vvddwktx.html