1.构造器
也叫构造函数,为了初始化类和结构体等类型的实例属性,关键字是init,init为默认构造器,类里面所有的非lazy的存储属性必须都有初始值,可以通过带有缺省值来初始化属性,也可以用init来初始化。析构器与构造器相反,在对象释放时调用,关键字是deinit。
语法:init(参数列表){初始化代码}
2。自定义构造器
带有参数的构造方法,参数的个数,循序都任意
class buy {
var a:Int
var b:String!
init(aa a1:Int,bb b1:String){
self.a = a1
self.b = b1
}
}
var b = buy(aa: 2, bb: "book")//init就是自定义构造器
3.析构器
析构器只能用于类类型
class Person {
let name: String
init(name: String){
self.name = name
print("\(name)init" )
}
deinit{
print("\(name)deinit")
}
}
//var p1 = Person(name: "tom")
//print(p1.name)//只调用init
//要想调用deinit,p1必须是person可选类型,而且必须置空,如下
var p1: Person? = Person(name: "tom")
print(p1!.name)
p1 = nil//自动调用deinit
注意:deinit不适用于结构体,枚举
class Animal {
init(){
print("animal init")
}
deinit{
print("animal deinit")
}
}
class Dog: Animal {
override init(){
print("dog init")
}
deinit{
print("dog deinit")
}
}
//var a: Animal? = Animal()
//a = nil
//
var d: Dog? = Dog()
d = nil
4.可选值存储属性可以在构造方法中不进行初始化,默认为空nil
5.针对结构体,系统会默认提供一个成员逐一构造器
struct Rect {
var w: Double//init可省略
var h: Double
}
var r = Rect(w: 2.0, h: 4.0)
6.值类型的构造器代理
就是构造方法之间的相互调用
struct Segment {
var origin: Double
var end: Double
init(origin: Double,end: Double){
self.origin = origin
self.end = end
}
init(){
// origin = 0.0
// end = 0.0
self.init(origin: 0.0,end: 0.0)
}
init(origin: Double,length: Double){
// self.origin = origin
// self.end = origin + length
self.init(origin: origin,end: origin + length)
}
func description()->String{
return "\(origin),\(end)"
}
}
var s = Segment(origin: 2.0, end: 2.0)
var s1 = Segment()
var s2 = Segment(origin: 2.0, length: 2.0)
print(s.description())
print(s2.description())
7.闭包或者全局函数或者当前类的类方法设置存储属性的缺省值
func GetValue()->Int{
return 10
}
class TestClass {
var x: Int = {()-> Int in
print("初始化开始")
sleep(4)
return 10
}()//将闭包执行过后的值作为缺省值赋给x,注意闭包后要加(),不加的话就是把闭包赋值给x了,没有意义
init(){
print("初始化完毕")
}
var z:Int = GetValue()//通过确据函数来设置缺省值
class func classGetValue()->Int {
print("class get value")
return 10
}
var b: Int = TestClass.classGetValue()//通过类方法来设置缺省值
}
var o = TestClass()