Swift 中枚举的基本用法

【经典算法】全排列问题(暴搜枚举) 题目简述 给定一个整数n,将数字1~n排成一排,按照字典序将所有的排列输出。 输入格式 共一行,包含一个整数n。 输出格式 按字典序输出所有排列方案,每个方案占一行。 数据范围 1≤n≤9 输入样例: 3 输出样例: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 暴力枚举 上图是递归树。我们要枚举,递归都可以画一棵树。当我们到最后一层时候,即该排列所有位都枚举完,填上数字了,就输出并返回。否则我们要枚举该排列的枚举的位上应该填什么数。 经典的回溯算法,暴力枚举。 时间 阅读详情

一、枚举语法

//枚举的语法:名称需要首字母大写
enum Direction {
    case north
    case south
    case west
    case east
}
//多个成员值可以出现在同一行中,要用逗号隔开
enum Direction2 {
    case north, south, west, east
}

注意:与 OC 不同的是,Swift 中的枚举在创建时不分配默认整数值。也就是说 north、south、west、east 不等于隐式的 0、1、2 和 3

二、使用 Switch 语句来匹配枚举值

enum Direction {
    case north, south, west, east
}
//使用 Switch 语句来匹配每一个单独的枚举值
let directionToHead = Direction.south
switch directionToHead {
case .north:
    print("north")
case .south:
    print("south")
case .west:
    print("west")
case .east:
    print("east")
}

三、遍历枚举的 case

  • 可以通过在枚举名字 后面写 : CaseIterable 来允许枚举被遍历。Swift 会暴露一个包含对应枚举类型所有情况的集 合名为 allCases。
//在枚举名字: 后面写 CaseIterable,Swift 会暴露 allCase 集合
enum Direction: CaseIterable {
    case north, south, west, east
}
//遍历枚举
for dir in Direction.allCases {
    print(dir)
}
print(Direction.allCases.count)   //获取枚举所有情况的个数

四、关联值

  • 可以定义 Swift 枚举来存储任意给定类型的关联值,如果需要的话不同枚举成员关联值的类型 可以不同
//关联值
enum BarCode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}
var productBarCode = BarCode.upc(1, 2, 3, 4)
print(productBarCode)    //打印: upc(1, 2, 3, 4)
productBarCode = .qrCode("ABSDEFGHIJK")
print(productBarCode)    //打印: qrCode("ABSDEFGHIJK")

//可以在 case 后面写 let 或者 在括号里面 写 let 定义相匹配的变量
switch productBarCode {
case .upc(let first, let second, let third, let fourth):
    print("UPC: \(first), \(second), \(third), \(fourth)")
case let .qrCode(productCode):
    print("QR code: \(productCode)")
}

五、原始值

  • 枚举成员可以用相同类型的默认值预先填充(称为原始值)

注意:如果声明的时候不指定枚举类型就没有rawValue属性(包括关联值)

//枚举也可以有原始值
enum ControlCharacter: Character {  //如果没有声明枚举的类型,是没有 rawValue 属性可以访问的
    case tab = "\t"
    case linefeed = "\n"
    case carrigeReturn = "\r"
}
print(ControlCharacter.linefeed.rawValue)  //输出结果是换行了

六、预设原始值

  • 在操作存储整数或字符串原始值枚举的时候,不必显式地给每一个成员都分配一个原始 值。当没有分配时,Swift 将会自动为你分配值
//预设原始值:预设west等于5,那么后面的值依次往后面加1
enum point: Int {
    case west = 5
    case north   // 6
    case east    // 7
    case south   // 8
}
print(point.south.rawValue)   //输出结果为:8

enum Point2: Int {
    case west
    case north
    case east = 5
    case south
}
//值得注意的是: 如果是给 east 赋值为 5, west 的值是从 0, north 的值是 1
print(Point2.south.rawValue)   // 6
print(Point2.west.rawValue)    // 0
print(Point2.north.rawValue)   // 1
//预设原始值: 必须要定义枚举的类型
enum point: String {
    case west
    case north
    case east
    case south
}
print(point.south.rawValue)   //输出结果为:south,此时可以不写 rawValue,它们输出的值是一样的

七、从原始值初始化

  • 如果用原始值类型来定义一个枚举,那么枚举就会自动收到一个可以接受原始值类型的值初始化器(叫做 rawValue的形式参数)然后返回一个枚举成员或者 nil 。你可以使用这个初始 化器来尝试创建一个枚举的新实例
//预设原始值:预设west等于5,那么后面的值依次往后面加1
enum point: Int {
    case west = 5
    case north   // 6
    case east    // 7
    case south   // 8
}
print(point.south.rawValue)   //输出结果为:8

//也可以使用rawValue来创建或者初始化一个枚举值,最终可以获取枚举的具体值
let direction2 = point(rawValue: 9)
print(direction2 ?? 0)   //如果direction2没有值的话,默认就是0

八、递归枚举

  • 递归枚举是拥有另一个枚举作为枚举成员关联值的枚举。当编译器操作递归枚举时必须插入间接寻址层。可以在声明枚举成员之前使用 indirect关键字来明确它是递归的
//如说表达式(5 + 4) * 2 在乘法右侧有一个数但有其他表达式在乘法的左侧
indirect enum Expression {
    case number(Int)
    case add(Expression, Expression)
    case multiply(Expression, Expression)
}
let four = Expression.number(4)
let five = Expression.number(5)
let sum = Expression.add(four, five)
print(four)
print(sum)
let multiply = Expression.multiply(sum, Expression.number(2))
print(multiply)
//在函数中根据switch语句获取匹配的case条件
func eval(_ expression: Expression) -> Int {
    //使用值绑定的方式
    switch expression {
    case .number(let value):
        return value
    case .add(let first, let second):
        return eval(first) + eval(second)
    case .multiply(let first, let second):
        return eval(first) * eval(second)
    }
}
print(eval(multiply))   // 18

注意: OC的枚举值只支持Int一种类型,Swift的枚举值支持四种类型: 整型(NSInteger)、浮点型(Double、Flaot)、字符串(String)、布尔类型(Bool)

十、总结

  1. Swift中的枚举很强大
  2. enum中的 rawValue 是其中的计算属性
  3. 如果声明的时候不指定枚举类型就没有rawValue属性(包括关联值)
  4. rawValue中的值存储在Mach-O中,不占用枚举的存储空间
  5. 枚举值与rawValue不是同一个东西
  6. rawValue可以不写,如果是Int默认0,1,2…String等于枚举名称的字符串
  7. 如果枚举中存在rawValue同时也会存在init(rawValue:)方法,用于通过rawValue值初始化枚举
  8. 如果枚举遵守了CaseIterable协议,且不是关联值的枚举,我们可以通过enum.allCases获取到所有的枚举,然后通过for循环遍历
  9. 我们可以使用switch对枚举进行模式匹配,如果只关系一个枚举还可以使用if case
  10. 关联值枚举可以表示复杂的枚举结构
  11. 关联值的枚举没有init方法,没有RawValue别名,没有rawValue计算属性
  12. enum可以嵌套enum,被嵌套的作用域只在嵌套内部
  13. 结构体也可以嵌套enum,此时enum的作用域也只在结构体内
  14. enum中可以包含计算属性,类型属性但不能包含存储属性
  15. enum中可以定义实例方法和使用static修饰的方法,不能定义class修饰的方法
  16. 如果想使用复杂结构的枚举,或者说是具有递归结构的枚举可以使用indirect关键字

可以参考文章 https://www.jianshu.com/p/d25860cf8757

Swift 枚举:深入理解与高效使用 枚举是一种自定义的数据类型,它将一组相关的值组织在一起。在 Swift 中,枚举可以包含整数、字符串、浮点数等任何类型的数据。Swift 枚举是一种强大的数据类型,它可以帮助我们更好地组织数据、管理状态以及处理业务逻辑。通过本文的介绍,相信你已经对 Swift 枚举有了更深入的了解。在实际开发中,熟练运用枚举可以让我们写出更加简洁、易读、易维护的代码。本文旨在为 Swift 开发者提供关于枚举的全面介绍,包括其定义、用法、高级用法以及实际应用。 阅读详情

相关推荐

用Linkboy玩转Arduino:3小时搞定智能倒车雷达(附仿真文件下载)

本文详细介绍了如何利用Linkboy图形化编程工具,在3小时内快速搭建一个基于Arduino的智能倒车雷达项目。通过仿真环境,初学者无需硬件即可学习超声波测距原理、报警逻辑设计,并完成从虚拟仿真到实体硬件的完整流程。文章提供了清晰的步骤、调试技巧及功能扩展思路,并附有仿真文件,是入门Arduino和智能硬件制作的绝佳实践指南。

weixin_29159441的博客 403

Swift 枚举

1.枚举的定义 枚举在C/C++/c#中,是一个被命名的整型常数的集合, 枚举在日常生活中很常见。 例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY,就是一个枚举。 在 Swift 中,枚举类型是一等(first-class)类型。它们采用了很多在传统上只被类(class)所支持的特性,例如计算型属性(computed properties),用于提供枚举值的附加信息,实例方法(instance method...

俊而不逊的博客 1367

基因树构建全流程:从OrthoFinder到iTOL的保姆级教程(附兰科植物案例)

本文提供了一份从OrthoFinder到iTOL的基因树构建全流程保姆级教程。详细解析了利用OrthoFinder构建物种树、IQ-TREE构建无根基因树、Notung进行树调和生根,以及最终在iTOL中实现专业可视化的每一步操作与实战经验,并以兰科植物NB-ARC基因家族为例进行演示,帮助研究者系统掌握基因树分析方法。

tequila的博客 523

IOS11,Swift4从入门到精通-10枚举

本节内容转载于 http://www.swift51.com/swift4.0/chapter2/08_Enumerations.html 本页内容包含: 枚举语法 使用 Switch 语句匹配枚举值 关联值 原始值 递归枚举 枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。 如果你熟悉 C 语言,你会知道在 C 语言中,枚举会为一组整型值分配相关联的名称...

liu_jiuyang的博客 337

高阶玩法——Dify生成的数据自动写入mysql数据库

采用自定义工具方式,利用 python编写一个服务sql_save_post,将接收到的内容写入指定数据库的表中,并为该服务撰写一个 OpenAPI 的 schema。配置工作流:我们以写入天气预报为例,在生成天气预报内容后,连接自定义工具“sql_save_post”,将所需的字段配置完成后,实现将生成的内容自动写入mysql数据库中。编写OpenAPI的schema:在dify平台的工具栏目,创建自定义工具,输入工具名称“sql_save_post”。工具:sql_save_post;

qq_44493378的博客 8539

保姆级教程:5分钟搞定微信小程序live-player组件接入监控视频流

本文提供了一份详细的微信小程序接入实时监控视频流的实战指南。文章对比了live-player与video组件的核心差异,重点解析了如何申请并开通live-player组件的严格权限,并提供了播放RTMP流(低延迟)的完整配置、状态监听与错误处理代码。同时,也介绍了使用video组件播放HLS流的备选方案,帮助开发者根据项目需求快速选择并实现稳定可靠的监控视频播放功能。

open4的博客 296

Swift - 枚举

场景:日期(digit表示使用年月日形式,string表示使用字符串形式)场景: 分数(points表示实际得分,grade表示分数的等级)可以使用MemoryLayout获取数据类型占用的内存大小。注意:原始值不占用枚举变量的内存。来表示每一个case就行,要获取。的值关联存储在一起,会非常有用。必要时let也可以改为var。的原始值的枚举又是怎样的?如果枚举的原始值类型是。other(1字节)

sharp521的博客 1258

Cadence PCB仿真 使用Allegro PCB SI为BRD文件创建通用型IBIS模型的方法图文教程

本文简单介绍使用Allegro PCB SI软件为BRD PCB设计文件中的元器件创建IBIS模型的方法。

fydar的博客 2169

Swift系列四 - 枚举

适度给类型起别名能够让代码更加易懂,开发效率更高,可维护性更好。 一、typealias(别名) typealias用来给类型起别名。 typealias Byte = Int8 typealias Short = Int16 typealias Long = Int64 typealias Date = (year: Int, month: Int, day: Int) func test(_ date: Date) { print(date.year) } test((2019, 6, 25

1024星球 536

Android-Zygote进程的诞生—从init到Zygote启动

Android Zygote进程启动流程解析 Android系统的Zygote进程是所有应用进程的父进程,由init进程创建。启动流程分为: 内核阶段:加载init进程(PID=1) init进程阶段: 挂载基础文件系统(tmpfs、proc等) 设置SELinux安全策略 解析init.rc配置文件 Zygote启动:init进程通过app_process启动Zygote,预加载系统资源 SystemServer:Zygote fork出系统服务进程 关键点: init是用户空间第一个进程......

保持专注,保持热爱 637

2ED2410-EM的使用

2ED2410-EM的使用

让你爱上电路设计 975

Swift学习(五): 枚举(基本用法,关联值,原始值,递归枚举,MemoryLayout,可选项,强制解包,可选项绑定,空合并运算符??,隐式解包,多重可选项,guard)

枚举的基本用法 等价于 =>> 使用: ------------------------------------------------------------------------------------------------------------------------------- 关联值(Associated Values) 有时会将枚举的成员...

weixin_42433480的博客 1008

Agisoft Metashape 基于RTK技术的无人机航测免像控技术流程

利用无人机进行航空摄影测量,其使用方便、快速获得成果,已经是测绘行业外业生产的主要方式。RTK定位系统的出现,其厘米级的定位系统,使得航测无人机在作业时,能够准确获取拍照时的GPS位置,能够大量减少像控点,即使不使用像控点也能满足规范对精度的要求。可以有效解决特殊地形(如山川、峡谷、河流、沼泽、水库等)外业人员很难布设像控点的情况。

penglu366366的博客 2188

Swift枚举的全用法

鉴于昨天开会部门会议讨论的时候,发现有些朋友对枚举的用法还是存在一些疑问,所以就写下这个文章,介绍下Swift下的枚举的用法。 基本的枚举类型 来,二话不说,我们先贴一个最基本的枚举: enum Movement { case letf case right case top case bottom } 这里就定义了一个简单的...

weixin_30693683的博客 188

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

swift5.1学习-4.枚举

1.枚举的基本用法 定义 enum Direction { case north case south case east case west } enum Direction { case north, south, east, west } 使用 var dir = Direction.west dir = Direction.east dir = .north print(dir) // north switch dir { case .north:

qq_31421983的博客 316

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

swift速览

基本用法 变量 var a = 3 var b: NSInteger? = 3 var c: NSInteger? var d: NSInteger d = 0 数组字典 var a = [1,2,3] var b: [Any?] = [4,5,"4"]; var c = [String?]() var d = ["name":1, "type":2] var f: [String: ...

qq_17190231的博客 197

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Swift 枚举的用法

1、基本用法 //enum direction { // case north // case south // case west // case east //} 等价于下面写法 enum direction { case north,south,west,east } var dir = direction.north dir ...

weixin_30682127的博客 111

Swift-类、结构体、枚举

001-枚举 //枚举 swift 中不会被赋于默认的整型值 enum someEnumeration { case north case sourth case east case west } //多个成员值要写在一行,用逗号隔开 enum Planet { case mercury,earth,mars } v...

dibu3564的博客 101

[Swift]枚举

1. Swift的枚举的基本用法: 1) 和其它语言枚举的意义相同,就是用有限的一组值(不能是无限的)来表示一些特定的含义; 2) Swift使用关键字enum定义枚举类型,定义体中用case定义成员值(和C语言等的成员值定义不太一样); 3) 由于Swift的枚举类型含有面向对象的一些特性(但并不是完全面向对象的,只有一小部分特性是面向对象的,比如成员值有自己的方法...

weixin_30858241的博客 101

swift中一些关于枚举的基础知识点

1. 简介 每个枚举都定义了一个全新的类型。枚举使用了很多被类支持的特性,例如计算属性,实例方法,初始化器,遵循协议。 枚举类型类似于Int,Double。所以在定义一个变量/常量时它的类型是枚举类型,而它的值又是枚举类型中的一个值。 2. 基本用法 如果变量/常量以枚举类型被声明,你可以用点语法把它设定成不同的值 示例: enum CompassPoint { case north ...

soviet1941的博客 886

Swift底层原理探索--枚举

目录 枚举的基本你用法 关联值(Associated Values) 关联值枚举 原始值(Raw Values) 隐式原始值(Implicitly Assigned Raw Values) 递归枚举(Recursive Enumeration) MemoryLayout 思考下面枚举变量的内存布局 窥探内存 进一步观察下面枚举的内存布局 枚举的基本你用法 【返回目录】 关联值(Associa...

RUNNING-NIUER的博客 824
上一篇: Swift 中的高阶函数
下一篇: Swift 中的存储属性、计算属性以及属性观察器
same_life
博客等级 码龄7年 25粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值