Swift8——屬性

定義

Swift中跟實例相關(guān)的屬性可以 分為2大類,存儲屬性和計算屬性

demo

存儲屬性

  • 類似于成員變量這個概念
  • 存儲在實例的內(nèi)存中
  • 結(jié)構(gòu)體、類可以定義存儲屬性
  • 枚舉不可以定義存儲屬性

存儲屬性初始值

  • 在創(chuàng)建類或結(jié)構(gòu)體的實例是,必須為所有的存儲屬性設置一個合適的初始值
  • 可以在初始化器里為存儲屬性設置一個初始值
  • 可以分配一個默認的屬性值作為屬性定義的一部分
2
3

計算屬性

  • 本質(zhì)就是方法(函數(shù))
  • 不占用實例的內(nèi)存
  • 枚舉、結(jié)構(gòu)體、類都可以定義計算屬性(因為他們都能定義方法)

計算屬性初始值

  • set傳入的新值默認叫做newValue,也可以自定義
  • 只讀計算屬性:只有g(shù)et沒有set (不能只有set,編譯器會報錯)
  • 定義計算屬性只能用var不能使用let
  • 計算屬性的值是可能發(fā)生變化的(即使是只讀計算屬性)
自定義默認
只有g(shù)et

枚舉值rawValue原理

  • 枚舉值原始值rawValue的本質(zhì)是:只讀計算屬性
枚舉

延遲存儲屬性

  • 使用lazy可以定義一個延遲存儲屬性,在第一次用到屬性的時候才會進行初始化
  • lazy屬性必須是var 不能是let(因為let要求初始化必須有值,所以不能與lazy一起使用)
延遲

延遲存儲屬性的注意點

  • 如果多線程同時第一訪問lazy屬性
  • 無法保證屬性只能被初始化一次
  • 能夠使一些不需要第一時間加載的,在需要的時間再去調(diào)用
  • 當結(jié)構(gòu)體包含一個延遲存儲屬性時,只要var才能訪問延遲屬性
  • 因為延遲屬性初始化時需要改變結(jié)構(gòu)體的內(nèi)存,

// p.z調(diào)用的時候,去初始化z,去改變結(jié)構(gòu)體的內(nèi)存,但是p是let,是不允許的,若是為var ,則是可以修改。

注意點

屬性觀察器

  • 可以為非lazyvar``存儲屬性設置屬性觀察器
  • willSet會傳遞新值,默認叫newValue
  • didSet會傳遞舊值,默認叫oldValue
  • 在初始化器中設置屬性值不會觸發(fā)willSetdidSet
  • 在屬性定義時設置屬性值不會觸發(fā)willSetdidSet
image.png
  • 屬性觀察器、計算屬性的功能,同樣可以應用在全局變量、局部變量
Demo
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

  • Swift語法基礎(五)-- (類和結(jié)構(gòu)體、屬性、方法) 本章將會介紹 類和結(jié)構(gòu)體對比結(jié)構(gòu)體和枚舉是值類型類是引用...
    寒橋閱讀 1,184評論 0 1
  • 中文文檔 一、存儲屬性 一個存儲屬性就是存儲在特定類或結(jié)構(gòu)體實例里的一個常量或變量。 存儲屬性可以是變量存儲屬性(...
    伯wen閱讀 249評論 0 0
  • 屬性用例: 存儲屬性 計算屬性可用于類、結(jié)構(gòu)體、枚舉。存儲屬性只能用于類和結(jié)構(gòu)體。 結(jié)構(gòu)體實例如果被賦值給一個常量...
    xmb閱讀 232評論 0 0
  • 屬性 Swift中跟實例相關(guān)的屬性可以分為2大類 存儲屬性(Stored Property) 類似于成員變量這個概...
    codeTao閱讀 193評論 0 1
  • 1、存儲屬性(var和let) 存儲屬性是一個作為特定類和結(jié)構(gòu)體實例一部分的常量或變量。存儲屬性要么是變量存儲屬性...
    余暉依舊耀眼閱讀 503評論 0 0

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