扩展就是向一个已有的类、结构体和枚举类型添加新功能。扩展可以对一个类型添加新的功能,但是不能重写已有的功能。
Swift中扩展可以:
- 添加计算型属性和计算型静态属性
- 定义实例方法和类型方法
- 提供新的构造器
- 定义下标
- 定义和使用新的嵌套类型
- 使一个已有类型符合某个协议
Who am I
扩展就是向一个已有的类、结构体和枚举类型添加新功能。扩展可以对一个类型添加新的功能,但是不能重写已有的功能。
Swift中扩展可以:
Swift语言类型转换可以判断实例的类型,也可以用于检测实例类型是都属于其父类或者子类的实例。Swift中类型转换使用is和as操作符实现,is用于检测值得类型,as用于转换类型。类型转换也可以用来检查一个类是否实现了某个协议。
Swift内存管理:管理引用类型的内存,不会管理值类型,值类型不需要管理。
内存管理原则:当没有任何强引用指向对象,系统会自动销毁对象(默认情况下所有的引用都是强引用)
通常情况下我们不需要去手动释放内存,因为ARC会在对象不再被引用,会自动销毁对象,但是有些时候还是需要在代码中实现内存管理
可选类型的本质其实就是一个枚举,
None | Some |
---|---|
没有值 | 有值 |
格式:Optional<类型> 或 在类型后面加上?号
由于可选类型在Swift随处可见,所以系统做了一个语法糖,在类型后面加上?
具体介绍可看之前的文章Swift-元祖、可选值
构造方法是为了使用某个类、结构体和枚举类型的实例而进行的准备过程。这个过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务。Swift构造方法使用init()方法
1 | init(参数列表){ 初始化代码 } |
与OC中的构造器不同,Swift的构造器无需返回值,他们主要的任务是保证新实例在第一次使用前完成正确的初始化。类实例也可以通过定义析构器(deinitializer)在类实例释放之前执行清理内存的工作
参考:菜鸟教程
下标脚本
可以定义在类(Class)、结构体(structure)和枚举(enmueration)这些目标中,可以认为是访问对象、集合或序列的快捷方式,不需要再调用实例的特定的赋值和访问方法。举例来说,用下标脚本访问一个数组(Array)实例中的元素可以这样写someArray[index],访问字典(Dictionary)实例中的元素可以这样写someDictionary[key]。
对于同一个目标可以定义多个下标脚本,通过索引值类型的不同来进行重载,而且索引值的个数可以是多个subscripts(下标):访问对象中数据的快捷方式,所谓下标脚本语法就是通过
实例[索引值]
来访问实例中的数据,类似于以前访问数组和字典,其实Swift中的数组和字典就是一个结构体
1 | Array: subscripts(index: Int) -> T |
懒加载:通俗来讲就是需要的时候才需要加载(创建)。怎么理解呢?比如一个数组或者一个控件,类init的时候根本不要对他们进行初始化or创建,我们需要使用的时候再初始化or创建,那么起到延迟作用了。也避免了类初始化的时候就要加载他们,减少内存不必要的开支
Swift类是构建代码所用的一种通用且灵活的构造体,可以为类定义属性(常量、变量)和方法。与其他变成语言所不同的是swift并不要求为自定义类去创建独立的接口和实现文件,你所要做的是在一个单一文件中定义一个类,系统会自动生成面向其他代码的外部接口