构造方法
- 作用
- swift 中 对 类 结构体枚举中的属性在对象构造完毕之后有初始值,所以他们都是需要有构造方法的
- 构造方法可以通过 类名() 的方法隐式调用 ,通过隐式创建的对象也会调用init方法
- 在重写init方法的时候需要加上override,同时如果调用了super.init() 方法 需要将super.init方法放到属性初始化赋值之后。
- 如果所有的属性都有初始值,那么可以不重写构造方法 因为系统会提供给我们一个隐式的初始化方法
eg
class Person: NSObject {
// person 类
var name : String = ""
var age : Int = 0
}
所有的属性都有初始值 那么可以直接使用 :类名() 的方法进行创建对象,也可以不重写初始化方法
class Person: NSObject {
var name : String = ""
var age : Int
override init() {
self.age = 0
super.init()
}
}
重写了初始化方法,而且调用了super.init 的方法。这个地方即使不调用super.init方法也是可以的
2 带有参数的构造方法
class Person: NSObject {
var name : String
var age : Int
// 这个地方不需要添加 override
init(name : String , age : Int) {
self.name = name
self.age = age
}
}
调用方法
let person = Person.init(name: "hahha", age: 15)
print("\(person.name) + \(person.age)")
3带有可选属性的初始化
class Person: NSObject {
var name : String?
var age : Int
init(name : String , age : Int) {
self.age = age
}
}
swift 4 中带有可选属性的可以不在构造方法中初始化
4 结构体的构造方法
在swift 中结构体也是需要构造方法的
struct Rect {
var height : Double = 0.0
var weight : Double = 0.0
// 这种情况不需要初始化是因为默认情况下结构体会给结构体内成员逐一构造器
/*
结构体会提供一个类似的这样的构造方法,所以我们可以直接使用init的方法来创建对象
init(height : Double , weight : Double) {
self.height = height
self.weight = weight
}*/
}
// 注意的是: 在结构体的初始化中如果有初始化方法 的实现 那么系统就不会在生成默认的 逐一构造器
5 构造器代理
struct Rect {
// 构造方法的迭代 构造方法也是方法的一种可以 方法直接可以直接进行调用
var weight : Double , height : Double
init(weight : Double, height : Double) {
self.weight = weight
self.height = height
}
init() {
self.init(weight: 0, height: 0)
}
}
6 通过闭包 全局函数或者类方法
class Person: NSObject {
var name : String
init(name : String) {
print("init 的方法的实现")
self.name = name
}
// 系统在执行初始化的时候会隐式执行闭包,将闭包的值给属性
// 因此 闭包的执行在初始化之前
var age : Int = {
() -> Int in // 这一行可以省略
print("age 的闭包实现")
return 20
}()
lazy var height : CGFloat = {
print("懒加载的 闭包")
return 100
}()
var age2 : CGFloat = getHeight()
var age3 : CGFloat = Person.getValue()
private class func getValue() -> CGFloat {
return 20
}
}
// 需要注意 当属性中是通过闭包,那么闭包先于构造方法的执行,当属性中有懒加载,由懒加载的特性,
使用到的时候才会去初始化,所以懒加载时晚于构造犯法.
⚠️ 懒加载时用到才执行 闭包时初始化的时候就执行
网友评论