Swiftストレージ属性


クラスは属性と方法で構成され、属性は一般的にデータメンバーにアクセスする.Object-Cでは、属性はカプセル化されたデータメンバーにアクセスするために設計され、属性自体はデータを格納せず、データはデータメンバーによって格納される.一方、Swiftの属性は格納属性と計算属性に分けられ、格納属性はObject-Cのデータメンバーであり、計算属性はデータを格納しないが、他の属性の戻り値を計算することによって
ストレージ属性は、定数属性と変数属性に分けてデータを格納できます.
ストレージ属性はクラスと構造体の2つのオブジェクト向け構造タイプに適用され、列挙属性にはストレージ属性がありません.
1、記憶属性概念
class Employee{
    
    let no:Int = 0
    var name:String = ""
    var job:String?
    var salary:Double = 0
    var dept:Department?
    
}
struct Department {
    
    let no:Int = 0
    var name:String = ""
    
}
var emp = Employee()
emp.no = 100 //  -----(1)
let Dept = Department()
Dept.name = "sales" //   --- (2)
let emp1 = Employee()
emp1.name = "sales"  - ------(3)

コードの1行目が定数属性を変更すると、プログラムはコンパイルエラーが発生し、2行目のコードもエラーが発生します.インスタンスdept自体が定数であるため、その属性nameが変数であっても変更できません.3行目のコードはコンパイルできます.それはemp 1がクラスインスタンスであり、参照タイプであり、depetが構造体インスタンスであり、値タイプであるためです.参照タイプはポインタに相当し、変数も変更できますが、値タイプの変更も変更できません.
2、遅延ストレージ属性
プログラムは、deptインスタンスは使用しませんが、メモリを消費します.Javaでは、hibernateというデータ永続化技術があり、hibernateには遅延ロード技術があり、swiftも遅延ロード基数を占めています.例は以下の通りです.
class Employee{
    
    let no:Int = 0
    var name:String = ""
    var job:String?
    var salary:Double = 0
    lazy var dept:Department? = Department()
    
}
struct Department {
    
    let no:Int = 0
    var name:String = ""
    
}

deptプロパティの前にlazyキーを付けると、deptのプロパティは遅延ロードであり、その名の通り、deptプロパティは最初にアクセスしたときにのみロードされます.いつまでもアクセスしないと作成されません.メモリの消費量を減らすことができます.