存儲(chǔ)屬性
- 存儲(chǔ)屬性:用于存儲(chǔ)一個(gè)常量或變量
- 結(jié)構(gòu)體實(shí)例賦值給常量,該實(shí)例屬性不能被修改(因?yàn)榻Y(jié)構(gòu)體屬于值類型,當(dāng)值類型的實(shí)例被聲明為常量的時(shí)候,它的所有屬性也就成了常量)
struct Teacher {
var name = ""
var age = 0
}
let teacher = Teacher()
//因?yàn)?teacher 被聲明成了常量,即使name是一個(gè)變量屬性,也無(wú)法修改
teacher.name = "good teacher" //報(bào)錯(cuò)
- 類實(shí)例賦值給常量,可以修改該實(shí)例變量屬性(類屬于引用類型)
class Student: NSObject {
var name = ""
var age = 0
}
let stu = Student()
stu.name = "good student"
懶加載屬性
懶加載屬性:是指當(dāng)?shù)谝淮伪徽{(diào)用的時(shí)候才會(huì)計(jì)算其初始值的屬性。在屬性聲明前使用 lazy 來(lái)表示延遲存儲(chǔ)屬性
注意:必須將延遲存儲(chǔ)屬性聲明成變量,因?yàn)閷傩缘某跏贾悼赡茉趯?shí)例構(gòu)造完成之后才會(huì)得到。而常量屬性在構(gòu)造過(guò)程完成之前必須要有初始值,因此無(wú)法聲明成懶加載屬性
class Student: NSObject {
lazy var name = ""
var age = 0
}
let student = Student()
print(student.name)
計(jì)算屬性
計(jì)算型屬性:不直接存儲(chǔ)值,而是通過(guò)get、set方法來(lái)取值或賦值
class Student: NSObject {
var firstName = ""
var lastName = ""
//定義計(jì)算屬性
var fullName:String {
//定義計(jì)算屬性的getter方法,該方法的返回值由firstName、lastName兩個(gè)存儲(chǔ)屬性決定
get{
return firstName + lastName
}
//定義計(jì)算屬性的setter方法(默認(rèn)名稱 newValue)
set{
self.firstName = newValue.components(separatedBy: " ")[0]
self.lastName = newValue.components(separatedBy: " ")[1]
}
}
}
let student = Student()
student.fullName = "xiao ming"
print(student.firstName) //xiao
print(student.lastName) //ming
只讀屬性,則無(wú)需set部分
class Student: NSObject {
var firstName = ""
var lastName = ""
var fullName:String {
get{
return firstName + lastName
}
}
}
let student = Student()
student.firstName = "xiao"
student.lastName = "ming"
print(student.fullName) //xiaoming
屬性監(jiān)聽(tīng)
-
willSet在新的值被設(shè)置之前調(diào)用(willSet會(huì)將新屬性值作為常量參數(shù)傳入,默認(rèn)名稱newValue表示) -
didSet在新的值被設(shè)置之后調(diào)用(didSet會(huì)將舊屬性值作為參數(shù)傳入,默認(rèn)參數(shù)名oldValue表示)
class Student: NSObject {
var name:String = "" {
willSet(newName){
print("新值是:\(newName)")
}
didSet{
print("舊值是:\(oldValue)")
}
}
}
let student = Student()
student.name = "小白"
print("---")
student.name = "小黑"
/*
新值是:小白
舊值是:
---
新值是:小黑
舊值是:小白
*/
注意:父類的屬性在子類的構(gòu)造器中被賦值時(shí),它在父類中的 willSet 和 didSet 觀察器會(huì)被調(diào)用,隨后才會(huì)調(diào)用子類的觀察器。在父類初始化方法調(diào)用之前,子類給屬性賦值時(shí),觀察器不會(huì)被調(diào)用
類型屬性
- 類型屬性:是指屬性屬于某一個(gè)類的而不是屬于某一個(gè)對(duì)象的。 可以認(rèn)為所有的實(shí)例公用這個(gè)屬性
- 類型屬性必須有默認(rèn)值
- 使用關(guān)鍵字
static來(lái)定義類型屬性
class Student: NSObject {
static var studentNum:Int = 100
}
print(Student.studentNum) //100