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)-枚举(列举)-讲给你懂相关推荐

  1. Swift基础入门知识学习(7)-字典-讲给你懂

    Swift基础入门知识学习(6)-数组(阵列)-讲给你懂 目录 声明字典 创建一个空字典 存取与修改字典 使用for-in遍历字典中的所有值 字典转换为数组 Swift字典(dictionary) 用 ...

  2. C++基础入门知识学习(通俗详细讲解)

    目录 命名空间 标注输入输出流 缺省参数 函数重载 引用 内联函数 C++11新特性auto关键字 C++11新特性基于范围的for循环 关键字nullptr 命名空间(关键字namespace) 在 ...

  3. 学python需要什么基础知识-学习Python需要知道哪些基础入门知识?

    众所周知,Python以优雅.简洁著称,入行门槛低,可以从事Linux运维.Python Web网站工程师.Python自动化测试.数据分析.人工智能等职位!就目前来看,Python就业前景广阔.很多 ...

  4. ps基础入门知识课程教程学习文字设计制作小白

    ps基础入门知识课程教程学习文字设计制作小白

  5. Python基础入门知识(2)

    接前面的文章: Python基础入门知识(1) Python基础入门教学 2 Python的基础知识 2.2 数据类型 2.2.2 数值类型 2.2.2.1 整数 2.2.2.2 浮点数 2.2.2. ...

  6. 长短时记忆神经网络python代码_零基础入门深度学习(6) - 长短时记忆网络(LSTM)

    无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...

  7. AI Studio 飞桨 零基础入门深度学习笔记1-深度学习的定义

    AI Studio 飞桨 零基础入门深度学习-笔记 人工智能.机器学习.深度学习的关系 机器学习 机器学习的实现 机器学习的方法论 案例:牛顿第二定律 确定模型参数 模型结构介绍 深度学习 神经网络的 ...

  8. 视频教程-人人都会深度学习之Tensorflow基础入门-深度学习

    人人都会深度学习之Tensorflow基础入门 大数据工程师/算法工程师/大数据讲师,毕业于西华大学软件工程专业.在大数据领域有着丰富的实战经验. 擅长领域:Spark/Hadoop.算法设计及系统架 ...

  9. AI Studio 飞桨 零基础入门深度学习笔记2-基于Python编写完成房价预测任务的神经网络模型

    AI Studio 飞桨 零基础入门深度学习笔记2-基于Python编写完成房价预测任务的神经网络模型 波士顿房价预测任务 线性回归模型 线性回归模型的神经网络结构 构建波士顿房价预测任务的神经网络模 ...

最新文章

  1. 【mysql】DATE_FORMAT()日期格式化
  2. java jvm内存地址_深入Java虚拟机——JVM内存详解
  3. 万云:区块链可帮助公证行业创新改革,为互联网公证打下基础
  4. UI上search 的drop down list是怎么实现的
  5. Attention和增强RNN (Attention and Augmented Recurrent Neural Networks)
  6. [设计模式]桥接模式
  7. vue变量传值_VUE 学习——父组件传值给子组件
  8. 数据中台VS业务中台、数据中台VS数据仓库,到底有什么区别?
  9. 如何提高生产力(四)、兼职为什么很难操作?
  10. 《消费者报告》杂志:Model 3和Model S被评选为美国最佳豪华汽车
  11. vue 2.0项目 favicon.ico不显示 解决方案
  12. 计算机的组成 —— 主板
  13. 没有躲过的坑--vector使用erase后迭代器变成野指针
  14. 自动化测试工具Selenium Appium
  15. 记一次golang cpu 占用100%
  16. MSSQL·手动安装机器学习相关CAB文件
  17. 脑膜瘤论文阅读(一)
  18. pb调用计算机默认游览器,PB打开ole控件IE浏览器版本问题_指定Webbrowser控件所用IE内核版本(转)...
  19. 8086的两种工作模式_8086系统中最小模式与最大模式两种工作方式的主要区别是什么?...
  20. Fiddler抓包工具常见功能介绍,还不会的进来看

热门文章

  1. (附源码)python方块新闻 毕业设计 091600
  2. 记录一些常用工具类方法
  3. Apache服务器配置SSL证书踩坑
  4. 计算机专业英语综述,计算机专业的文献综述
  5. 第十一届蓝桥杯大学B----既约分数
  6. 2015年中国游戏用户行为研究报告
  7. 实现扑克牌的洗牌功能
  8. 使用WinGate代理服务器使局域网连接到Internet
  9. cpprestsdk 上传和下载文件
  10. zao显示服务器错误,ZAO修改用户协议回应质疑 用户内容不会用作他用