【iOS】Swift关键知识点汇总
 visitors

Swift扩展

扩展就是向一个已知的类、结构体或枚举类型添加新功能。扩展可以对一个类型添加新的功能,但是不能重写已有的功能。

Swift中的扩展可以:

  • 添加计算型属性和计算型静态属性
  • 定义实例方法和类型方法
  • 提供新的构造器
  • 定义下标
  • 定义和使用新的嵌套类型
  • 使一个已有类型符合某个协议

Swift类型转换

Swift语言转换可以判断实例的类型,也可以用于检测实例类型是否属于其父类或则子类的实例。

Swift中类型转换使用isas操作符实现,is用于检测值的类型,as用于转换类型。

类型检查

类型检查使用is关键字,操作符is是来检查一个实例是否属于特定子类型,若事例属于这个子类型,类型检查操作返回true,否则返回false。

向下转型

向下转型,用转型操作符(as?或则as!)。

当你不确定向下转型可以成功时,用类型转换的条件形式(as?)。条件形式的类型转换总是返回一个可选值(optional value),并且若下转是不可能的,可选值将是nil。

只有当你可以确定向下转型一定会成功时候,才使用强制形式(as!)。当你试图向下转型一个不正确的类型时,强制形式的类型转换会触发一个运行时错误。

Any和AnyObject的类型转换

Swift为确定别名类型提供了两种特殊的类型别名:

  • AnyObject可以代表任何class类型的实例。
  • Any可以表示任何类型,包括方法类型(function types)。

在一个switch语句的case中使用强制形式的类型转换操作符as(而不是as?)来检查和转换到一个明确的类型。

Swift自动引用计数(ARC)

Swift使用自动引用计数(ARC)这一机制来跟踪和管理引用程序的内存。通常情况下我们不需要手动释放内存,因为ARC会在类的实例不在被使用时,自动释放其占用的内存。但在有些时候我们还是需要在代码中实现内存管理。

ARC功能

  • 当每次使用init()方法创建一个类的新的实例的时候,ARC会分配一大块内存来存储实例的信息。
  • 内存会包含实例的类型信息,以及这个实例所有相关属性的值。
  • 当实例不再被使用时,ARC释放实例所占用的内存,并让释放的内存能挪作他用。
  • 为了确保使用中的实例不被销毁,ARC会跟踪和计算每一个实例正在被多少属性、变量和常量所引用。
  • 实例赋值给属性、变量和常量时,它们都会创建此实例的强引用,只要引用还在,实例是不允许被销毁的。

解决实例之间的循环强引用

Swift提供了两种办法来解决你在使用类的属性时所遇到的循环强引用问题:

  • 弱引用(weak)
  • 无主引用(unowned)

弱引用和无主引用允许循环引用中的一个实例引用另外一个实例而不保持强引用。这样实例能够互相引用而不产生循环强引用。

解决闭包引起的循环强引用:在定义闭包时同时定义捕获列表作为闭包的一部分,通过这种方式可以解决闭包和类实例之间的循环强引用。

对于生命周期中会变成nil的实例使用弱引用,相反的,对于初始化后再也不会被赋值为nil的实例,使用无主引用。

当闭包和捕获的实例总是互相引用时并且总是同时销毁时,将闭包内的捕获定义为无主引用。