Swift基础入门知识学习(12)-枚举(列举)-讲给你懂
TED演讲的8个秘诀:学习18分钟高效表达-重点笔记
Swift基础入门知识学习(11-2)-閉包-第二篇-讲给你懂
目录
- 枚举(列举)语法
- 使用 Switch 语句匹配枚举(列举)值
- 相关值
- 原始值
- 递回枚举(列举)
理解难度
★★★☆☆
实用程度
★★★☆☆
枚举(列举)简单的说也是一种数据类型,只不过这种数据类型只包含自定义的特定数据;它是一组有共同特性的数据的集合。
枚举(列举)的功能:
- 声明在类中,可以通过实例化类来访问它的值。
- 枚举(列举)也可以定义构造函数(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能。
- 可以遵守协议(protocols)来提供标准的功能。
枚举(列举)支援很多特性,例如计算型属性(computed property)、实例方法(instance method)、定义建构器(initializer)、扩展(extension)及协定(protocol)。
枚举(列举)语法
枚举(列举)使用enum关键字建立,并将枚举(列举)定义放在一组大括号{ }内,格式如下:
enum 枚举(列举)的自定义类型 {
各枚举(列举)定义
}
例子如下:
//这是一个定义指南针四个方位的枚举(列举)
enum CompassPoint {case northcase southcase eastcase west
}// 多个成员值可以写在同一行 以逗号 , 隔开
// 这是一个定义太阳系八大行星的枚举(列举)
enum Planet {case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
每个枚举(列举)都定义了一个全新的类型。像 Swift 中其他类型一样,枚举(列举)的名称(如上述程式中的CompassPoint及Planet)应该以一个大写字母开头且为单数。
定义完枚举(列举)后,接着将其指派给一个变量,与一般指派方式相同:
// 这边使用上面定义过的指南针方位的枚举(列举)// 类型为 CompassPoint 的一个变量 值为其枚举(列举)内的 west
var directionToHead = CompassPoint.west// 这时已经可以自动推断这个变量的类型为 CompassPoint
// 如果要再指派新的值 可以省略枚举(列举)的类型名称
directionToHead = .north
使用 Switch 语句匹配枚举(列举)值
这边同样使用上面定义过的指南针方位的枚举(列举)。使用switch语句匹配单个枚举(列举)值:
directionToHead = .south
switch directionToHead {case .north:print("这是北边")
case .south:print("这是南边") // 这行会被打印
case .east:print("这是东边")
case .west:print("这是西边")
}
相关值
枚举(列举)中的每个成员值,可以在需要的时候,一并储存自定义的一个或一个以上的其他类型的相关值(associated value)。使用方法为在成员值后面加上小括号( ),并将相关值类型放在小括号内(就像使用元组tuple一样)。往后在程式中将该枚举(列举)成员值指派给变量或常量时,这个(或这些)相关值才会被设置,之后也可以依照需求再修改相关值。
枚举(列举)中每个成员所定义的相关值类型可以依照需求设置成不同类型。
enum Student{case Name(String)case Mark(Int,Int,Int)
}
var studDetails = Student.Name("Runoob")
var studMarks = Student.Mark(98,97,95)
switch studMarks {case .Name(let studName):print("学生的名字是: \(studName)。")
case .Mark(let Mark1, let Mark2, let Mark3):print("学生的成绩是: \(Mark1),\(Mark2),\(Mark3)。")
}
原始值
除了使用相关值的枚举(列举),其内的成员值可以储存不同类型的相关值。Swift 也提供枚举(列举)先设置原始值(raw value)来代替相关值,这些原始值的类型必须相同。使用方法为在枚举(列举)名称后加上冒号 : 并接着原始值类型,例子如下:
enum WeekDay: Int {case monday = 1case tuesday = 2case wednesday = 3case thursday = 4case friday = 5case saturday = 6case sunday = 7
}let today = WeekDay.friday
// 使用 rawValue 属性来取得原始值
// 打印:5
print(today.rawValue)
- 原始值可以是字符串、字元或者任何整数值或浮点数值。
- 每个原始值在它的枚举(列举)声明中必须是唯一的。
原始值(raw value)跟相关值(associated value)是不同的。原始值在定义枚举(列举)时即被设置,对于一个特定的枚举(列举)成员,它的原始值始终是相同的。而相关值是在枚举(列举)成员被指派为一个变量(或常量)时才一并设置的值,枚举(列举)成员的相关值是可以不同的。
递回枚举(列举)
递回枚举(列举)(recursive enumeration)是一种枚举(列举)类型,它会有一个或多个枚举(列举)成员使用该枚举(列举)类型的实例作为相关值。如果要表示一个枚举(列举)成员可以递回,必须在成员前面加上indirect,例子如下:
// 定义一个枚举(列举)
enum ArithmeticExpression {// 一个纯数字成员case number(Int)// 两个成员 表示为加法及乘法运算 各自有两个[枚举(列举)的实例]相关值indirect case addition(ArithmeticExpression,ArithmeticExpression)indirect case multiplication(ArithmeticExpression,ArithmeticExpression)
}// 或是你也可以把 indirect 加在 enum 前面
// 表示整个枚举(列举)都是可以递回的
indirect enum ArithmeticExpression {case number(Int)case addition(ArithmeticExpression, ArithmeticExpression)case multiplication(ArithmeticExpression,ArithmeticExpression)
}
接者使用一个递回函数来示范这个递回枚举(列举):
func evaluate(_ expression: ArithmeticExpression) -> Int {switch expression {case .number(let value):return valuecase .addition(let left, let right):return evaluate(left) + evaluate(right)case .multiplication(let left, let right):return evaluate(left) * evaluate(right)}
}// 计算 (5 + 4) * 2
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))// 打印:18
print(evaluate(product))
上述程式可以看到,当函数的参数为纯数字,会直接返回该数字的值。而如果是加法或乘法运算,则是分别计算两个表达式的值后,再相加或相乘。
Swift基础入门知识学习(13)-类&结构体(类别及结构)-讲给你懂
高效阅读-事半功倍读书法-重点笔记-不长,都是干货
Swift基础入门知识学习(12)-枚举(列举)-讲给你懂相关推荐
- Swift基础入门知识学习(7)-字典-讲给你懂
Swift基础入门知识学习(6)-数组(阵列)-讲给你懂 目录 声明字典 创建一个空字典 存取与修改字典 使用for-in遍历字典中的所有值 字典转换为数组 Swift字典(dictionary) 用 ...
- C++基础入门知识学习(通俗详细讲解)
目录 命名空间 标注输入输出流 缺省参数 函数重载 引用 内联函数 C++11新特性auto关键字 C++11新特性基于范围的for循环 关键字nullptr 命名空间(关键字namespace) 在 ...
- 学python需要什么基础知识-学习Python需要知道哪些基础入门知识?
众所周知,Python以优雅.简洁著称,入行门槛低,可以从事Linux运维.Python Web网站工程师.Python自动化测试.数据分析.人工智能等职位!就目前来看,Python就业前景广阔.很多 ...
- ps基础入门知识课程教程学习文字设计制作小白
ps基础入门知识课程教程学习文字设计制作小白
- Python基础入门知识(2)
接前面的文章: Python基础入门知识(1) Python基础入门教学 2 Python的基础知识 2.2 数据类型 2.2.2 数值类型 2.2.2.1 整数 2.2.2.2 浮点数 2.2.2. ...
- 长短时记忆神经网络python代码_零基础入门深度学习(6) - 长短时记忆网络(LSTM)
无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...
- AI Studio 飞桨 零基础入门深度学习笔记1-深度学习的定义
AI Studio 飞桨 零基础入门深度学习-笔记 人工智能.机器学习.深度学习的关系 机器学习 机器学习的实现 机器学习的方法论 案例:牛顿第二定律 确定模型参数 模型结构介绍 深度学习 神经网络的 ...
- 视频教程-人人都会深度学习之Tensorflow基础入门-深度学习
人人都会深度学习之Tensorflow基础入门 大数据工程师/算法工程师/大数据讲师,毕业于西华大学软件工程专业.在大数据领域有着丰富的实战经验. 擅长领域:Spark/Hadoop.算法设计及系统架 ...
- AI Studio 飞桨 零基础入门深度学习笔记2-基于Python编写完成房价预测任务的神经网络模型
AI Studio 飞桨 零基础入门深度学习笔记2-基于Python编写完成房价预测任务的神经网络模型 波士顿房价预测任务 线性回归模型 线性回归模型的神经网络结构 构建波士顿房价预测任务的神经网络模 ...
最新文章
- 【mysql】DATE_FORMAT()日期格式化
- java jvm内存地址_深入Java虚拟机——JVM内存详解
- 万云:区块链可帮助公证行业创新改革,为互联网公证打下基础
- UI上search 的drop down list是怎么实现的
- Attention和增强RNN (Attention and Augmented Recurrent Neural Networks)
- [设计模式]桥接模式
- vue变量传值_VUE 学习——父组件传值给子组件
- 数据中台VS业务中台、数据中台VS数据仓库,到底有什么区别?
- 如何提高生产力(四)、兼职为什么很难操作?
- 《消费者报告》杂志:Model 3和Model S被评选为美国最佳豪华汽车
- vue 2.0项目 favicon.ico不显示 解决方案
- 计算机的组成 —— 主板
- 没有躲过的坑--vector使用erase后迭代器变成野指针
- 自动化测试工具Selenium Appium
- 记一次golang cpu 占用100%
- MSSQL·手动安装机器学习相关CAB文件
- 脑膜瘤论文阅读(一)
- pb调用计算机默认游览器,PB打开ole控件IE浏览器版本问题_指定Webbrowser控件所用IE内核版本(转)...
- 8086的两种工作模式_8086系统中最小模式与最大模式两种工作方式的主要区别是什么?...
- Fiddler抓包工具常见功能介绍,还不会的进来看