Swift基础 类的属性与特殊方法(监听、延迟加载)

类的属性

类的属性分三种,存储属性、计算属性、类属性。

其中,
存储属性用于存储一般性的变量和常量。
计算属性返回经过一些计算的属性。
类属性是与类自身息息相关的属性。

存储属性

如下方所示,就是存储属性。

class Person : NSObject{
    
    
    var name : String
    var age : UInt8 = 0
    var height : Float = 160.0
    
    init(personName:String) {
    
    
        name = personName
    }
}

计算属性

通过别的方式而有值的属性,一般不需要赋初始值。可以设置get方法与set方法。

class Person : NSObject{
    
    
    var courseChinsesScore = 88.5
    var courseEnglishScore = 90.5
    var averageCourseScore:Double{
    
    
        return (courseChinsesScore + courseEnglishScore) * 0.5
    }
}

如上,averageCourseScore就是计算属性,不需要赋初始值,但需要在数据类型声明后面接上一对大括号,用于计算逻辑的书写。

类属性

类属性是与类息息相关的属性,并且是通过类名进行访问的。

class Person : NSObject{
    
    
    var name : String
    static var behaviour : [String] = ["吃","喝","拉","撒"]
    
    init(personName:String) {
    
    
        name = personName
    }
}

let xiaoMing = Person.init(personName: "xiaoMing")
print("\(xiaoMing.name)会做:\(Person.behaviour)")

运行结果:

xiaoMing会做:["吃", "喝", "拉", "撒"]

类的willSet()和didSet()

通过给类的属性添加willSet()和didSet()方法,可以给类的属性增加观察者。在WillSet方法中,其被设置的新的属性值,如果不进行重命名的话,就是默认名newValue,旧值则为oldValue。

    static var locationMSVersion : NSNumber = 0 {
    
    
        didSet{
    
    
            if onlineMSVersion != 0  {
    
    
                compareMSVersion()
            }
        }
    }
    
    static var onlineMSVersion :NSNumber = 0 {
    
    
        didSet{
    
    
            if locationMSVersion != 0  {
    
    
                compareMSVersion()
            }
        }
    }

上述的代码为,只要更新了相对应的值,就调用didSet里面的代码段。

类的延迟加载 lazy关键字

延迟加载是指当第一次被调用的时候,才回去进行初始化操作的属性。这样的设置,可以减少初期不必要的加载等待时间。

class Dog{
    
    
    var name = "dog"
    init() {
    
    
        print("wang wang wang")
    }
}

class Person{
    
    
    var age:Int
    var name:String
    init(name:String,age:Int){
    
    
        self.name = name
        self.age = age
    }
    
    var hasDog:Dog = Dog()
}

var xiaoMing = Person(name: "xiaoMing", age: 18)
print(xiaoMing.name)

运行结果:

wang wang wang
xiaoMing

从代码中,可以看出,在调用的时候,没有使用到hasDog属性,但对象xiaoMing初始化的时候,把没有用到的属性都一起给初始化了。

一般情况下,不考虑内存性能,这样是没有问题的。

如果考虑上内存与性能的话,暂时没有用到的属性就延后加载,让内存资源分配给更需要的对象,因而,我们需要对暂时没有用到的属性声明一下懒加载,使用lazy关键字,使得该属性被调用的时候才初始化加载进内存。

class Person{
    
    
    var age:Int
    var name:String
    init(name:String,age:Int){
    
    
        self.name = name
        self.age = age
    }
    
    lazy var hasDog:Dog = Dog()
}

var xiaoMing = Person(name: "xiaoMing", age: 18)
print(xiaoMing.name)

运行结果:

xiaoMing

运行结果中没有调用Dog的初始化,现在我们打印一下xiaoMing的hasDog属性,这样就会在需要的时候把Dog加载上了。

var xiaoMing = Person(name: "xiaoMing", age: 18)
print(xiaoMing.name)
print(xiaoMing.hasDog)

运行结果:

xiaoMing
wang wang wang
__lldb_expr_62.Dog

猜你喜欢

转载自blog.csdn.net/kkkenty/article/details/124785443