Swift实用小册07:枚举的创建、遍历、关联值、原始值

举报
文如秋雨 发表于 2022/08/30 12:44:01 2022/08/30
【摘要】 在本章中,你将学会枚举的常见使用方法,包含但不限于枚举的创建、遍历、关联值、原始值和递归。前言和Apple官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift语言的一些概念和用法,方便大家更好地学习和掌握Swift语言。这同时也是对自己学习Swift语言过程的知识整理。如有错误,以你为准。我们新建一个PlayGround文件,命名为SwiftEnum。枚举的创建枚举,是具有相同...
在本章中,你将学会枚举的常见使用方法,包含但不限于枚举的创建、遍历、关联值、原始值和递归。

前言


和Apple官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift语言的一些概念和用法,方便大家更好地学习和掌握Swift语言。

这同时也是对自己学习Swift语言过程的知识整理。

如有错误,以你为准。

我们新建一个PlayGround文件,命名为SwiftEnum。




枚举的创建


枚举,是具有相同类型的一组值的集合。

在Swift语言实际开发过程中,常常需要事先定义好一组值对应的枚举类型,然后在业务代码中引用。

我们使用enum关键词来创建枚举,而且在Swift语言中,枚举的名称需要大写开头,示例:

//枚举的创建

enum MealTimeName {
    case breakfast
    case lunch 
    case afternoonTea
    case supper
    case nightSnack
}

上述代码中,我们定义了一个MealTime餐段的枚举,我们使用case在这个枚举里定义了5个枚举的成员值。

我们也可以简化代码,示例:

//枚举的创建

enum MealTimeName2 {
    case breakfast,lunch,afternoonTea,supper,nightSnack
}

枚举的使用


在实际业务中,枚举常常作为一种类型,用于判断不同值的情况下,需要执行什么动作。

首先,我们定义一个变量,赋予一个初始值,这个值可以来源于枚举。示例:

//枚举的使用

var currentMealTime = MealTimeName.breakfast

当我们声明的变量类型确定的情况下,我们也可以通过省略声明方式和枚举的名称来简化代码,示例:

//枚举的使用

currentMealTime = .breakfast

然后,结合之前章节所学的Switch语句,我们可以匹配枚举的成员值,从而输出不同的结果。示例:

//枚举的使用

currentMealTime = .breakfast

switch currentMealTime {
case .breakfast:
    print("吃早餐啦!")
case .lunch:
    print("吃午饭啦!")
case .supper:
    print("吃晚饭啦!")
default:
    print("不是正餐")
}

上述代码中,我们声明了变量currentMealTime当前餐段,默认值为breakfast早餐,然后使用Switch语句匹配currentMealTime对应枚举MealTimeName的成员值,匹配到值后执行操作。因为我们这里不需要匹配所有的值,只需要匹配“正餐”,我们使用default分支来涵盖其他不需要匹配的值。

枚举的遍历


和遍历数组的方法类似,这里用来访问枚举范围的函数为allCases所有成员。但不同的是,在Swift4.2以后,我们的枚举还需要遵循CaseIterable协议,它是用于合成简单枚举类型的allCases 静态属性。示例:

//枚举的遍历

enum MealTimeName3:String,CaseIterable {
    case breakfast,lunch,afternoonTea,supper,nightSnack
}
print("\(MealTimeName3.allCases)")

上述代码中,枚举MealTimeName3遵循CaseIterable协议,我们就可以通过allCases访问枚举内的所有成员,我们这里打印输出枚举内的所有成员,结果为“breakfast,lunch,afternoonTea,super,nightSnack”。

枚举的关联值


枚举定义过程中,如果每个枚举项都有附加的类型信息,即指定枚举的成员的输入类型,我们把这个附加信息叫做关联值。关联值是用来给枚举成员赋予更多信息,从而简化代码的,让代码结构更加清晰。示例:

//枚举的关联值

enum PowerType {
    case directload(String)
    case joinToken(String, String)
}


class WebViewController: UIViewController {
    let powerType: PowerType!
    
    init(powerType: PowerType) {
        self.powerType = powerType
        
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        switch self.powerType {
        case .directload(let url):
            //直接用url请求网页
            break
            
        case .joinToken(let url, let token):
            //用url拼接token后再加载网页
            break


        case .none: break
        }
    }
}

上述代码中,我们实现了一个app跳转网页的方法,它有两种情况,一是直接跳转,二是拼接token后,再跳转。在PowerType枚举中,我们使用了枚举关联值的方式,directload关联值带有String类型,joinToken关联值带2个String类型。

枚举的原始值


原始值,是为枚举项提供一个默认值。

如果我们需要指定枚举内成员值的类型和值对应的默认值,也可以在定义枚举的时候,给枚举附上类型以及给参数赋原始值。

//枚举的原始值

enum MealTimeType: Int{
    case breakfast = 1
    case lunch = 2
    case afternoonTea = 3
    case supper = 4
    case nightSnack = 5
}

上述代码中,我们给MealTimeType枚举定义其类型为Int整型,然后枚举内每个参数都赋予值了对应的原始值。定义好了原始值后,我们就可以用枚举项的 rawValue 属性来输出它。

//枚举的原始值

print("MealTimeType.breakfast.rawValue")
print(MealTimeType(rawValue:1))


以上就是本章的全部内容。
快来动手试试吧!
如果本专栏对你有帮助,不妨点赞、评论、关注~
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。