假设有问题,请留言问我。
我的Swift新手教程专栏
http://blog.csdn.net/column/details/swfitexperience.html
为什么要有构造器:为类中自身和继承来的存储属性赋初值。
一、两种构造器-指定构造器和便利构造器
指定构造器:类中必备的构造器。为全部的属性赋初值。(有些子类可能不须要显示声明,由于默认从基类继承了)
便利构造器:类中的辅助构造器,通过调用指定构造器为属性赋初值。(仅在必要的时候声明)
举例
class Food {
    var name: String
    init(name: String) {
        self.name = name
    }
    convenience init() {
        self.init(name: "[Unnamed]")
    }
}便利构造器通过conveniencekeyword声明,能够看到。便利构造器是通过调用指定构造器来进行构造的。这也就是一个关键的概念:横向代理。
何为代理:就是让别人帮你干活
二、构造过程中的规则
(一)构造器链就是调用构造器的顺序
规则例如以下:
1.1、指定构造器必须调用其父类的指定构造器
1.2、便利构造器必须调用同一类中的指定构造器
1.3、便利构造器必须最后以调用一个指定构造器而结束
总得来说一句话:便利构造器横向代理,指定构造器向上代理。
举个样例:
class Base{
    var baseVar:String
    init(baseInput:String){
        baseVar = baseInput
    }
    convenience init(){
        self.init(baseInput:"")
    }
}
class Sub:Base{
    var subVar:String;
    init(subInput:String,baseInput:String){
        subVar = subInput
        super.init(baseInput:baseInput)//这里是规则1.1
    }
    convenience init(conSubInput:String){
        self.init(subInput:conSubInput,baseInput:"")//这里是规则1.2
    }
    convenience init(){
        self.init(conSubInput:"")//这里是规则1.3,由于调用了另外一个便利构造器,而另外一个便利构造器以调用指定构造器结束
    }
}
样例一:
class Base{
    var baseVar:String
    init(baseInput:String){
        baseVar = baseInput
    }
    convenience init(){
        self.init(baseInput:"basevar")
    }
}
class Sub:Base{
    var subVar:String = "subvar";
}这里子类未定义不论什么构造器,所以满足规则2.1,2.1,将继承全部父类的指定构造器和便利构造器var instance1 = Sub() var instance2 = Sub(baseInput:"newBaseVar")
class Base{
    var baseVar:String
    init(baseInput:String){
        baseVar = baseInput
    }
    init(firstPart:String,secondPart:String){
        baseVar = firstPart + secondPart
    }
    convenience init(){
        self.init(baseInput:"basevar")
    }
}
class Sub:Base{
    var subVar:String;
    init(subInput:String,baseInput:String){
        subVar = subInput
        super.init(baseInput)
    }
}var instance = Sub(subInput:"subvar",baseInput:"basevar")
class Base{
    var baseVar:String
    init(baseInput:String){
        baseVar = baseInput
    }
}
class Sub:Base{
    var subVar:String;
    func subPrint(){
        println("如今能够调用实例方法了")
    }
    init(subInput:String,baseInput:String){
        subVar = subInput
        super.init(baseInput:baseInput)
//这里就完毕了阶段一
        self.subVar = subInput + "123"//此时能够调用self
        subPrint()//此时也能够调用实例方法了
    }
}总得来说:当类的实例的内存被初始化完毕,也就是调用super.init()之后,就完毕了阶段一了。这个非常简答,如果继承来个x,你先为x赋值为1了,而在调用父类构造器。父类构造器会为x赋另外一个初值来保证初始化过程完毕,那么你赋值的1就被覆盖了
检查三
  便利构造器先调用同类中其它构造器,再为随意属性赋初值。和检查二类似。也是防止被覆盖
检查四
  构造器在第一阶段完毕之前。不能饮用self,不能调用不论什么实例属性,不能调用实例方法
四、总结一下
指定构造器的过程是这种
1、为自己的属性赋初值
2、调用基类构造器(super.init)
3、然后就能够调用self,和实例方法,存储属性。定制新的值了。
然后,我们看下官方文档里给出的一个比較好的样例
class Food {
    var name: String
        init(name: String) {
        self.name = name
    }
    convenience init() {
        self.init(name: "[Unnamed]")
    }
}
class RecipeIngredient: Food {
    var quantity: Int
    init(name: String, quantity: Int) {
        self.quantity = quantity
        super.init(name: name)
    } 
    override convenience init(name: String) {
        self.init(name: name, quantity: 1)
    }
}
class ShoppingListItem: RecipeIngredient {
    var purchased = false
    var description: String {
    var output = "\(quantity) x \(name.lowercaseString)" {
        output += purchased ? " YES" : " NO"
        return output
    }
}这个构造器链的关系如图原文:http://www.cnblogs.com/lcchuguo/p/5057541.html