swift 语法

swift4 构造方法(一)

2017-12-13  本文已影响475人  sttech

构造方法

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
    }
 }
// 需要注意 当属性中是通过闭包,那么闭包先于构造方法的执行,当属性中有懒加载,由懒加载的特性,
使用到的时候才会去初始化,所以懒加载时晚于构造犯法.
⚠️ 懒加载时用到才执行 闭包时初始化的时候就执行
上一篇下一篇

猜你喜欢

热点阅读