面向对象编程概述
面向对象三大特性:继承,封装,多态
从整体上看,swift中的类,结构体,枚举三者具有完全平等的地位
枚举和结构体是值类型的,类是引用类型的
枚举从此站了起来
我们使用enum来定义一个枚举,然后将其内容存让在{}内
多个成员值可以出现在同一行内,使用逗号隔开
在定义枚举之后,我们可以使用switch语句来匹配每一个单独的枚举值
可以定义swift枚举来存储任意给定类型的关联值,如果需要的话不同枚举成员关联值之间的类型可以不同
当你操作存储整数或者字符串原始值枚举的时候,你不必显式地给每一个成员都分配一个原始值,swift会自动为你分配值
当拥有另外一个枚举作为枚举成员关联值的枚举,称为递归枚举,需要使用indirect来声明
如何为类,结构体,枚举添加属性
延迟存储属性:只有在第一次使用的时候才进行计算,使用lazy修饰
note:如果被lazy修饰的属性同时被多个线程访问,则无法保证只初始化一次
计算属性:实际上并不存储值,其提供一个读取器和一个可选的设置其来间接得到和设置其他的属性
willset在该值被存储之前调用
didset会在一个新值被存储后调用,一个包含旧属性值的常量会作为形式参数传递,你可以为它命名,默认为oldValue
类型属性:我们可以使用static关键字来定义类型属性
如果为类,结构体,枚举添加方法
实例方法:
-
是指对应实例的函数,它们为这些实例提供功能性,要么通过提供访问和修改实例属性的方法,要么通过提供与实例目的相关的函数
-
每一个类的实例【结构体和枚举不含】都隐含一个self属性,它完完全全等于实例本身,可以使用self属性在当前实例当中调用它本身的方法
-
如果你没有显示写出self,swift会在你于方法中使用已知属性或者方法的时候假定你是调用了当前实例的方法
-
如果你的形参和已知参数保持一致,那么就需要使用self来进行区分
类型方法:
在func前使用static关键字来声明一个类型方法,类同样可以使用class关键字允许子类重写父类对类型方法的实现
类的初始化
所有类的存储属性都必须在初始化期间分配初始值
swift为类类型定义了两种初始化器以保证所有的存储属性都可以接受不了一个初始值,这就是所谓的制定初始化器和编写初始化器
指定的初始化器就是可以初始化类引用的属性并且调用合适的父类初始化器来继续这个初始化过程给父类链
note:便携初始化器可以定义多个
你可以在相同的类中定义一个便携初始化器给支持的初始化器设置默认参数
note:我们使用convince来标识便携初始化器
-
初始化器在创建特定类型的实例的时候被调用
init() {}
-
我们可以在定义的属性的时候进行初始化,为其设置默认的属性值
-
初始化可以调用其余初始化器来执行部分实例的初始化,这称为初始化器的委托
安全检查
-
指定初始化器向上委托的时候,其所在类引入的所有属性都需要初始化完成
-
指定初始化器必须先向上委托父类初始化器,才能够为继承的属性赋新值
-
便携初始化器必须先委托同类的其余初始化器,才能再为任意属性赋新值
反初始化
在类实例被释放的时候自动调用,我们不能手动调用,使用deinit来声明
继承
任何不从另一个类继承的类都是基类
子类继承父类,用冒号分隔
重写:子类可以提供自己的实例方法,类型方法,实例属性,类型属性,和下标脚本的自定义实现,否则其就会从父类继承,重写需要使用override关键字
我们可以使用super前缀来访问父类的属性,方法或下标脚本
多态和类型转换
我们可以使用类型操作符is来检查一个实例是否属于一个特定的子类,如果实例是该子类型,返回true
我们也可以使用as?做向下的类型转换