swift初始化 init

2019-07-25  本文已影响0人  SwiftDev

swift初始化器有两种:

初始化器的一些特点:

初始化器的调用规则:

下图是初始化器之间的相互调用关系:


image.png

这样保证了,使用任意初始化器,都可以完整的初始化实例

两段式初始化

第一阶段:初始化所有成员

调用如下图:


image.png

第二阶段

这个调用是从上到下的如图:

image.png

一个完整的初始化过程从上到下:


image.png

总结:苹果做的安全检查

override

特点

自动继承

举个反例:


image.png

required

属性观察器
这里涉及到一个属性观察器的一个小知识点:
属性观察器在自己的初始化中是不会被调用的,但是在子类中的初始化中,是会被调用的

class Animal: NSObject  {
    var name: String {
        willSet {
            print("willSet: \(newValue)")
        }
        didSet {
            print("didSet: \(oldValue)")
        }

    }
    init(name: String) {
        self.name = name
        super.init()
    }
}

class Person: Animal {
    var height: Double
    init(height: Double) {
        self.height = height
        super.init(name: "jack")
        self.name = "rose"
    }
}
// 没有打印
Animal(name: "swift")
/*
 打印
 willSet: rose
 didSet: jack
 */
Person(height: 19)

可失败初始化器

init?(){ } 

允许初始化器为nil;calss,结构体,枚举 都可以定义可失败初始化器

Int("xxxx") 
public init?(_ description: String)

这个就是可失败初始化器

deinit

deinit 类似于OC中的dealloc,内存释放的时候调用

class Aniaml {
    deinit {
        print("对象销毁了")
    }
}

父类的deinit可以被继承;
子类的deinit调用完成后会在调用父类的deinit

上一篇 下一篇

猜你喜欢

热点阅读