第2部分 故事的进阶要素 - 编程语言Swift的进阶部分
8 枚举, 结构体和类
8.1 概念通俗讲解
1). 枚举,简单理解:一一列举的意思。也就是说把互斥的类型一个一个列举出来。
例如性别,列举出来其中的类型:男和女。
2). 类是对现实中一类具有共同特征事物的抽象。例如我们可以把人当做一个类。
与类相对应的就是实例。实例就是类具体的实际例子。例如人是类,人中的一个具体人,比如小王,就是实例。
类的本质是一种数据类型,一种比Int等基本数据更复杂的数据类型。
3). Swift中,从概念的角度讲,结构体和类很像。
结构体也是对现实中一类具有共同特征事物的抽象。举例:我们也可以把人当做一个结构体。
与结构体相对应的也是实例。例如人是结构体,人中的一个具体人,比如小王,就是实例。
从概念上看,结构体和类是很相似的,不过实际使用中,还是有很多不同的。下面是结构体与类的比较
结构体和类的共同点
(1)有属性
(2)有方法
(3)可定义下标
(4)可定义构造器
(5)可通过扩展增加功能
(6)可遵循协议提供功能
结构体和类的不同点
类具有一些结构体没有的功能:
(1)继承特性
(2)类型转换在运行时可以检查和解释一个类实例
(3)析构器让一个类的实例可以释放被分配的资源
(4)引用计数功能
注:属性,方法,下标,构造过程,扩展,协议,继承,类型转换,析构过程和自动引用计数后面会具体讲解。
8.2 最简洁的定义格式
1). 枚举定义
使用enum关键字定义枚举
enum 枚举名{
case 枚举值
case 枚举值
}
举例:
enum Sex{
case 男
case 女
}
定义小王的性别是男性
var xiaoWangSex = Sex.男
定义变量时如果指定了枚举的类型,Sex.男可以简化为.男
var xiaoLiSex : Sex = .男
如下的各个case可以用一个case来简写
enum Age{
case one
case two
case three
case four
}
简写形式如下
enum Age2{
case one, two, three, four
}
var xiaoWangAge = Age.two
2). 结构体定义
使用struct关键字定义结构体
struct 结构体名{
}
举例:
struct person2{
}
定义实例xiaoWang
定义实例xiaoLi
3)类定义
使用class关键字定义结构体
class类名{
}
举例:
class person{
}
8.3 我的经验总结
1)枚举的本质是一个数据类型。一个自定义的数据类型。主要是定义各种互斥值的数据类型。
2)枚举的case后面是变量和常量,不能用已经知道的数据类型,例如
enum Age{
case 1
case 2
}
1和2属于Int类型的值,这样是不允许的。我们需要定义变量one和two才可以
3). 枚举和switch经常配对使用
举例
enum Sex{
case 男
case 女
}
var xiaoSongSex = Sex.男
switch xiaoSongSex {
case .男:
print("小宋是男性")
case .女:
print("小宋是女性")
}
4). 结构体是值类型,类是引用类型的总结
举例:
class person{
var age = 10
}
struct person2{
var age = 20
}
var xiaoWang = person()
var xiaoLi = person2()
var xiaoWang2 = xiaoWang
xiaoWang.age = 15
print(xiaoWang2.age)
var xiaoLi2 = xiaoLi
xiaoLi.age = 15
print(xiaoLi2.age)
注:这里var age = 10和var age = 20的age是属性,对于属性后面会做具体的讲解。
类是引用类型,引用类型实例使用的解释:
var xiaoWang2 = xiaoWang这一步实际是xiaoWang把值引用给了xiaoWang2,xiaoWang和xiaoWang2同时指向了1个内存地址。所以xiaoWang.age的值改变,xiaoWang2.age的值也跟着改变,此时xiaoWang2.age值是15
结构体是值类型,值类型实例使用的解释:
var xiaoLi2 = xiaoLi这一步实际是xiaoLi把值拷贝一份给xiaoLi2,xiaoLi和xiaoLi2是有2个内存地址的。所以xiaoLi.age的值改变,xiaoLi2.age的值不改变,此时xiaoLi2.age的值是20
5). 类实例的比较
类是引用类型,比较两个类实例是否等价与非等价的运算符如下
等价于 (=)
非等价 (!)
举例
class person{
var age = 10
}
class person2{
var age = 10
}
var xiaoWang = person()
var xiaoWang2 = person2()
if xiaoWang === xiaoWang2{
}
注:本人水平和能力有限,如果哪些地方写错了,请大家给我反馈,我会及时修改。