swift 屬性(存儲(chǔ)屬性、計(jì)算屬性、懶加載屬性、類型屬性)

存儲(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í),它在父類中的 willSetdidSet 觀察器會(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫(xiě)文章,發(fā)現(xiàn)簡(jiǎn)書(shū)還為我保存起的...
    Jenaral閱讀 3,144評(píng)論 2 9
  • Swift語(yǔ)法基礎(chǔ)(五)-- (類和結(jié)構(gòu)體、屬性、方法) 本章將會(huì)介紹 類和結(jié)構(gòu)體對(duì)比結(jié)構(gòu)體和枚舉是值類型類是引用...
    寒橋閱讀 1,179評(píng)論 0 1
  • 屬性將值跟特定的類、結(jié)構(gòu)或枚舉關(guān)聯(lián)。存儲(chǔ)屬性存儲(chǔ)常量或變量作為實(shí)例的一部分,而計(jì)算屬性計(jì)算(不是存儲(chǔ))一個(gè)值。計(jì)算...
    CDLOG閱讀 391評(píng)論 0 0
  • 屬性將值跟特定的類、結(jié)構(gòu)或枚舉關(guān)聯(lián)。存儲(chǔ)屬性存儲(chǔ)常量或變量作為實(shí)例的一部分,而計(jì)算屬性計(jì)算(不是存儲(chǔ))一個(gè)值。計(jì)算...
    窮人家的孩紙閱讀 452評(píng)論 0 0
  • 我該如何掙扎么?又為什么而做呢?感覺(jué)自己與周圍的人和事格格不入,想開(kāi)口不知道說(shuō)些什么,如何是好……
    空屋子閱讀 266評(píng)論 6 0

友情鏈接更多精彩內(nèi)容