Swift 的初始化
本文来自苹果的官方文档
1.Swift的初始化和Objective-C的初始化是有所不同的,init方法并不会有显示的返回值
2.Swift中类和结构体的初始化时,必须要给其储存属性赋值.(备注:Swift中枚举是不能添加储存属性的)你可以选择在init方法中为属性赋值,也可以选择直接声明属性时直接赋值.若是属性为可选,你可以不显示的赋值,因为系统会默认将其初始化为nil.常量可以在init的时候赋值,但是一旦赋值将无法被更改
3.init方法和其他方法一样也可以有Parameter Names 和Argument Labels,但是在init方法中若是你不声明Argument Labels则Parameter Names默认为Argument Labels,你也可以选择使用"_"代替Argument Labels则Argument Labels和正常的方法一样被省略.
4.Swift的类和结构体当其属性都有默认值时,且其没实现任何一种init方法(包括继承得到的),Swift会为其提供一个默认的init方法
5.对于结构体类型来说,即使其属性没有默认值,它会自动根据其成员提供一个成员初始化的方法
6.Initializer Delegation(构造器代理),意思是一个init方法可以调用另一个init方法完成初始化,但是对于值类型和引用类型来说,Initializer Delegation的实现机制还是不一样的,值类型不能继承,所以Initializer Delegation只是简单的完成初始化和赋值,而引用类型Initializer Delegation还需要考虑其继承的关系
7.指定构造器和便利构造器(结构体和枚举中没有),指定构造器必定要调用其父类构造器(如果有父类),便利构造器必须调用其平级的构造器,下图能很好的展示调用关系
构造器的调用关系8.Swift中类的初始化为两段构造,即类的初始化分为两步.第一步:初始化属性,为其分配内存空间,赋给属性默认值.第二步:你可以选择在初始化的时候,重新赋值属性.为了完成两段构造,Swift的编译器实现了4步检查:指定构造器在调用父类之前必须确保自己的属性被完全初始化,当赋值给继承来的属性时必须确保先调用父类的方法.便利构造器在赋值给任何属性的时候必须调用自己同级的构造方法,因为便利构造器其实就相当于Initializer Delegation
9.与Objective-C不同的是Swift的子类默认是不会继承父类的构造方法的.如果子类重写父类的指定构造初始化方法,必须加上override,即使子类实现的方式是便利构造.相反的,如果子类重写父类的便利构造,那么override是不用写的,因为子类的便利构造是不能调用父类的.
10.构造器的继承,假如子类的所有存储属性都有默认值,那么构造器的继承就需要符合两个规则.第一,子类如果没有自定义任何的指定构造器,那么就会自动继承父类的所有指定构造器.第二,如果子类重写了父类所有的指定构造器(即使是规则一继承下来的),那么子类就会继承父类所有的便利构造器
11.可失败构造器,使用"init?"声明一个可失败构造器,可失败构造器可以返回一个为nil的值.可失败构造器的使用方式和指定构造器并无区别
12.必须构造器使用关键字"required"声明,表示子类必须实现该构造方法