类的属性
类的属性分三种,存储属性、计算属性、类属性。
其中,
存储属性用于存储一般性的变量和常量。
计算属性返回经过一些计算的属性。
类属性是与类自身息息相关的属性。
存储属性
如下方所示,就是存储属性。
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