swift从入门到精通12-初始化

190 阅读2分钟

1.初始化器

类,结构体,枚举都可以定义初始化器。类有两种初始化器,一种是指定初始化器,另一种是便捷初始化器。

例子:

class Persion {
    //初始化器
    init() {
        
    }
    
    //便捷初始化器
    convenience init(name:String) {
        self.init()
    }
}

初始化器调用规则:

  1. 指定初始化器必须在它的直系父类中调用指定初始化器
  2. 便捷初始化器必须从它的相同类中调用另外一个初始化器
  3. 便捷初始化器最终必须调用一个指定初始化器

2.两段式初始化

第一阶段:初始化所有存储属性。

外层调用初始化器,分配内存实例,但并未初始化,指定初始化器先初始化存储属性,再调用父类初始化器,形成初始化链。

第二阶级:设置新的存储属性值

从顶部初始化器往下,链中每一个指定初始化器都会实例,初始化器可以使用self来访问修改属性,调用它的实例方法。

例子:

class Persion {
    var name:String = ""
    init() {
        print(3)
        self.name = "小白"
        print(4)
    }
}


class Student: Persion {
    override init() {
        print(2)
        super.init()
        print(5)
        self.name = "小黑"
    }
    
    convenience init(name:String) {
        print(1)
        self.init()
        print(6)
        self.name = name
    }
}

var stu = Student(name: "姓名")

3.override和required

override是重写方法,重写父类的方法都有override修饰。

required修饰的方法,子类必须继承此方法,并且需要用required修饰而不用override。

例子:

class Father{
    required init () {
        
    }
    
    init(name:String) {
        
    }
}

class Sun: Father {
    required init() {
        super.init()
    }
    
    override init(name: String) {
        super.init(name: name)
    }
}

4.可失败初始化器

类、结构体、枚举都可以使用init?定义可失败初始化器。

  • 可失败初始化器可以调用非可失败初始化器,非可失败初始化器调用可失败初始化器需要进行解包。

  • 如果初始化器调用一个可失败初始化器导致初始化失败,那么整个初始化过程都失败,并且之后的代码都停止执行 。

例子:

class Time {
    var name: String
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
}

var time = Time(name: "")
print(time?.name ?? "实例失败");

5.反初始化器

deinit 叫做反初始化器,类似于OC的dealloc。当类的实例对象被释放内存时,就会调用实例对象的deinit方法。

  • deinit不接受任何参数,不能写小括号,不能自行调用 
  • 父类的deinit能被子类继承子类的deinit实现执行完毕后会调用父类的deinit

例子:

class A {
    deinit {
        print("A被释放")
    }
}


class B: A {
    deinit {
        print("B被释放")
    }
}


func test() {
    var b = B()
}


test()

上一篇文章:swift从入门到精通11-继承

下一篇文章:swift从入门到精通13-可选链

参考:zhuanlan.zhihu.com/p/268364142