一、引言
构造方法是一个类创建对象最先也是必须调用的方法,在Objective-C中,开发者更习惯称这类方法为初始化方法。在Objective-C中的初始化方法与普通函数相比除了要以init抬头外并无太严格的分界,而在Swift语言体系中,构造方法与普通的方法分界十分严格,从格式写法上就有不同,普通方法函数要以func声明,构造方法统一为init命名,不需要func关键字声明,不同的构造方法采用方法重载的方式创建。
二、构造方法的复写与重载
在Objective-C中,不同的初始化方法就是不同的函数,这便不存在方法重载的概念。Swift中要创建自定义的构造方法,需要开发者对init构造方法进行重载操作。任何一个自定义的类,只要其有父类,除了可以继承下来父类已有的构造方法外,还可以复写父类的构造方法,使其适用于自身。和Objective-C类似,复写父类的构造方法时,要在其中调用父类的构造方法,重载可以理解为一种特殊的复写父类构造方法,因此在重载的构造方法中也要调用父类的构造方法。
创建一个继承于NSObject的类,复写构造方法,代码示例如下:
class ClassOne: NSObject {
//声明一个本类特有的常量
var tip:Int
//复写父类的构造方法 需要用override关键字
override init() {
//构造方法中要对所有成员常量完成创建
tip = 1;
//在创建完所有成员常量后 调用父类构造方法
super.init()
}
//重载构造方法1
init(one:Int){
tip=one
super.init()
}
//重载构造方法2 使用convenience关键字进行修饰
convenience init(two:String) {
//使用convenience关键字进行修饰的构造方法要调用本类的构造方法进行
self.init(one: two.characters.count)
}
//重载构造方法3 使用required关键字进行修饰 使用required关键字进行修饰的构造方法子类必须继承或复写
required init(three:Float) {
tip=10
super.init()
}
上面示例代码中,不带参数的init()方法为复写父类的方法,因此需要使用关键字override来修饰。重载构造方法1带一个Int类型的 参数,父类中并没有这个构造方法,但是在其实现中,依然需要调用父类中的某个构造方法完成。构造方法2是一个带String类型参数的构造方法,其用convenience关键字为构造方法的一个修饰关键字,后面会介绍。构造方法3为一个带Float类型参数的构造方法,但其使用required关键字进行了修饰,使用required关键字进行修饰的构造方法子类必须继承或者复写。构造方法1,2,3都是对init()构造方法的一种重载,但却是3中类型全然不同的构造方法。
三、Designated构造方法与Convenience构造方法
Swift中的构造方法分为Designated构造方法与Convenience构造方法两类,Designated构造方法也被称为指定构造方法,Convenience构造方法也被称为方便构造方法。Designated构造方法不加任何修饰关键字,Convenience构造方法需要使用Convenience关键字进行修饰。可以这样理解,Convenience类型的构造方法是为了方便使用从Designated构造方法中分支出来的构造方法,官方文档中有如下描述:








