1. 程式人生 > >swift學習記錄(儲存屬性)

swift學習記錄(儲存屬性)

屬性

屬性將值跟特定的類、結構體和列舉關聯。

swift中的屬性分為儲存屬性計算屬性兩種。

儲存屬性:

一個儲存屬性就是儲存在特定類或結構體的例項裡的一個常量或變數。儲存屬性可以是變數儲存屬(用關鍵字var 定義),

也可以是常量儲存屬性(用關鍵字let 定義)。

class Person{
    let id:Int  = 0
    var name :String = ""
}

let boy = Person()
boy.id = 1    //編譯報錯,常量屬性不能修改
boy.name = "張三" //變數屬性可以修改

常量結構體的儲存屬性

如果建立了一個結構體的例項並將其賦值給一個常量,則無法修改該例項的任何屬性,即使定義了變數儲存屬性:

struct Person{
    var id:Int  = 0
    var name :String = ""
}

let boy = Person()
 // 編譯報錯,常量結構體的屬性不能修改
boy.id = 1
boy.name = "張三"

這種行為是由於結構體(struct)屬於值型別。當值型別的例項被宣告為常量的時候,它的所有屬性也就成了常量。

屬於引用型別的類(class)則不一樣。把一個引用型別的例項賦給一個常量後,仍然可以修改該例項的變數屬性。

延遲儲存屬性

使用 lazy 關鍵字 宣告。延遲儲存屬性是指當第一次被呼叫的時候才會計算其初始值的屬性。

延遲儲存屬性必須是變數,因為屬性的初始值可能在例項構造完成之後才會得到。而常量屬性在構造過程完成之前必須要有初始值,因此無法宣告成延遲屬性。

當屬性的值依賴於在例項的構造過程結束後才會知道具體值的外部因素時,或者當獲得屬性的初始值需要複雜或大量計算時,可以只在需要的時候計算它。這時就

需要用到 延遲儲存屬性。

class DataImporter {
/*
DataImporter 是一個將外部檔案中的資料匯入的類。
這個類的初始化會消耗不少時間。*/
    var fileName = "data.txt"
    // 這是提供資料匯入功能
}
class DataManager {
    lazy var importer = DataImporter()
    var data = [String]()
    // 這是提供資料管理功能
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// DataImporter 例項的 importer 屬性還沒有被建立
print(manager.importer.fileName) //importer 屬性只有在第一次被訪問的時候才被建立
// DataImporter 例項的 importer 屬性現在被建立了
// 輸出 "data.txt”

注意:

如果一個被標記為lazy 的屬性在沒有初始化時就同時被多個執行緒訪問,則無法保證該屬性只會被初始化一次。