//: A UIKit based Playground for presenting user interface

import UIKit

struct Fahrenheit{
var temperatrue:Double
init(){
temperatrue = 32.0
}

}
var f = Fahrenheit()
print("The default temperatrue is \(f.temperatrue)℃ Fahrenheit")

也可以这么写 

//: A UIKit based Playground for presenting user interface

import UIKit

struct Fahrenheit{
var temperatrue:Double = 32.0

}
var f = Fahrenheit()
print("The default temperatrue is \(f.temperatrue)℃ Fahrenheit")

类的初始化委托

指定初始化器必须从它的直系父类调用指定初始化器

便捷初始化器必须从相同的类里调用另一个初始化器

便捷初始化器最终必须调用一个指定初始化器

 

两段式初始化

  • Swift 的类初始化是一个两段式过程。在第一个阶段,每一个存储属性被引入类分配了一个初始值,一旦每个村出实行的初始状态被确定,第二个阶段就开始了。每个类都有机会在新的实例准备使用之前来定制它的存储属性
  • 两段初始化过程的hi用让初始化更加安全,同时在每个类的层级结构给与了完备的灵活性,两段式初始化过程可以防止属性值在初始化之前被访问,还可以防止属性值被另一个初始化器意外地赋予不同的值

 

两段初始化实如何进行的

 

1、指定初始化器必须保证在向上委托给父类初始化器之前,其所在类引用的所有属性都要初始化完成

2、指定初始化器必须先向上委托父类初始化器,然后才能为继承的属性设置新值。如果不这样做,指定初始化器赋予新值将被父类初始化器所覆盖,

3、便捷初始化器必须先委托同类中的其他初始化器,然后再为任意属性赋新值(包括同类里定义的属性)如果没有那么做,便捷构造初始化器赋予的新值将被自己类中其他指定初始化器所覆盖。

4、初始化起在第一阶段初始化完成之前,不能调用任何实例方法,不能读取任何实例属性,也不能引用self作为值

反初始化器

每个类中只能有一个反初始化器,反初始化器不接受任何形式参数,并且不需要写括号

//: A UIKit based Playground for presenting user interface

import UIKit

class Person{
var name:String
var age:Int
init(name:String,age:Int){
self.name=name
self.age=age
}
convenience init(){
self.init(name:"[Unnamed]",age:0)
}
deinit {
print("deint")
}
}



let a = Person();