swift文档笔记(十二) -- 构造过程

构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例可用前必须执行这个过程,具体操作包

括设置实例中每个存储型属性的初始值和执行其他必须的设置或初始化工作。



1.存储属性的初始赋值 

类和结构体在创建实例时,必须为所有存储型属性设置合适的初始值。存储型属性的值不能处于一个未知的状态。如果是可选类型,会默认设置为nil。

你可以在构造器中为存储型属性赋初值,也可以在定义属性时为其设置默认值。以下小节将详细介绍这两种方法。

当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观察者。




2.默认构造器 

如果结构体或类的所有属性都有默认值,同时没有自定义的构造器,那么 Swift会给这些结构体或类提供一个默认构造器(default initializers)。这个默认构造器将简单地创建一个所有属性值都设置为默认值的实例。 


结构体的逐一成员构造器 

如果结构体没有提供自定义的构造器,它们将自动获得一个逐一成员构造器,即使结构体的存储型属性没有默认值。




3.指定构造器和便利构造器的语法 

指定构造器:

init(parameters) {

    statements

便利构造器:

convenience init(parameters) {

    statements

init(parameters) {

    statements



4.构造器的继承和重写 

Swift 中的子类默认情况下不会继承父类的构造器。 假如你希望自定义的子类中能使用跟父类相同的构造器,你可以在子类中重写这些构造器。重写指定构造器时,要加override修饰符。便利构造器严格来说不是被重写,不需要加修饰符。


构造器的自动继承 

子类在默认情况下不会继承父类的构造器。但是如果满足以下条件,父类构造器是可以被自动继承的。

规则

如果子类没有定义任何指定构造器,它将自动继承所有父类的指定构造器。 

规则 2
如果子类提供了所有父类指定构造器的实现——无论是通过规则 1 继承过来的,还是提供了自定义实现——它将 自动继承所有父类的便利构造器。 




5.必要构造器

在类的构造器前添加 required 修饰符表明所有该类的子类都必须实现该构造器。

在子类重写父类的必要构造器时,必须在子类的构造器前也添加 required 修饰符,表明该构造器要求也应用于继 承链后面的子类。在重写父类中必要的指定构造器时,不需要添加 override 修饰符。



6.通过闭包或函数设置属性的默认值 

如果某个存储型属性的默认值需要一些定制或设置,你可以使用闭包或全局函数为其提供定制的默认值。每当某个属性所在类型的新实例被创建时,对应的闭包或函数会被调用,而它们的返回值会当做默认值赋值给这个属性。

如果你使用闭包来初始化属性,请记住在闭包执行时,实例的其它部分都还没有初始化。这意味着你不能在闭包 里访问其它属性,即使这些属性有默认值。同样,你也不能使用隐式的 self 属性,或者调用任何实例方法。

class SomeClass {

    let someProperty: SomeType = {

// 在这个闭包中给 someProperty 创建一个默认值 // someValue 必须和 SomeType 类型相同 return someValue 

}() 

 } 



7.析构过程 

Swift 会自动释放不再需要的实例以释放资源。如自动引用计数章节中所讲述,Swift 通过 自动引用计数(AR C) 处理实例的内存管理。通常当你的实例被释放时不需要手动地去清理。但是,当使用自己的资源时,你可能 需要进行一些额外的清理。 

析构器是在实例释放发生前被自动调用。你不能主动调用析构器。子类继承了父类的析构器,并且在子类析构器

实现的最后,父类的析构器会被自动调用。即使子类没有提供自己的析构器,父类的析构器也同样会被调用。


deinit {
// 执行析构过程 








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值