天天看点

iOS开发(Swift)总结20 - 枚举, 结构体和类

第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{
}
           

注:本人水平和能力有限,如果哪些地方写错了,请大家给我反馈,我会及时修改。