iOS開發Swift篇—(九)屬性

來源:互聯網
上載者:User

標籤:

一、類的定義

Swift與Objective-C定義類的區別

Objective-C:一般需要2個檔案,1個.h聲明檔案和1個.m實現檔案

Swift:只需要1個.swift檔案

Swift中類的定義格式

1 class 類名  {2     // ... 屬性和方法3 }

 

二、屬性

1.什麼是屬性

  Swift中的屬性(Properties),就類似於其他物件導向語言中的成員變數

2.屬性的分類

按照官方文檔的說明,屬性可以分為以下幾種

(1)儲存屬性(Stored Properties)

(2)計算屬性(Computed Properties)

(3)類型屬性(Type Properties)

3.儲存屬性

1)簡單說明

儲存屬性:儲存屬性就是儲存在對象(執行個體)中的一個變數或者常量

儲存屬性類似於其他物件導向語言中的成員變數

1 class Person {2     var age: Int = 13     var height: Double = 0.04     let life = 15 }

說明:

Person類中定義了3個儲存屬性

2個變數儲存屬性:Int類型的age、Double類型的height 

1個常量儲存屬性:Int類型的life

系統並不會自動初始化上面的3個儲存屬性,需要進行手動初始化

2)儲存屬性的讀寫

  如何讀寫儲存屬性?

  直接通過點運算子(.),就可以讀寫某個對象的儲存屬性  

1 class Person {2     var age: Int = 13     let life = 14 }5 var p = Person()6 p.age = 207 println("p的生命是\(p.life), p的年齡是\(p.age)")

說明:

第5行:建立Person對象

第6行:給對象p的age屬性賦值

第7行:訪問對象p的life屬性值和age屬性值

3)延遲儲存屬性

什麼是延遲儲存屬性?

延遲儲存屬性是第一次使用時才進行初始化的屬性

使用@lazy來標識一個延遲儲存屬性

1 class Person {2     @lazy var dog: Dog = Dog()3 }4 var p = Person()5 println(p.dog)

說明:

  執行第5行代碼時,才會去初始化dog屬性,才真正建立了Dog對象

延遲儲存屬性的使用注意:延遲儲存屬性必須是變數,不能是常量

延遲儲存屬性的好處:讓某些資源用到時再去載入,避免一些不必要的資源浪費

 

4.計算屬性

(1)什麼是計算屬性

跟儲存屬性不一樣的是,計算屬性不是直接儲存值,而是提供get和set

get:用來取值,封裝取值的過程

set:用來設值,封裝設值的過程

(2)程式碼範例:

 1 class Square { 2     // 正方形的寬度 3       var width: Double = 0.0 4     // 正方形的周長 5       var girth: Double { 6         get { 7             // 周長 = 寬度 * 4 8                 return width * 4 9         }10         set(newGirth) {11             // 寬度 = 周長 / 412                    width = newGirth / 413         }14     }15 }

計算屬性舉例:

1 var s = Square()2 s.width = 103 println(s.girth)4 s.girth = 200 5 println(s.width) 

說明:

第3行代碼:調用girth屬性的get,輸出結果是40

第4行代碼:調用girth屬性的set,並且把200傳遞給newGirth參數

第5行代碼:輸出結果是50

(3)簡便的set

  set也可以不特意指定新值的參數名,新值的預設參數名叫做newValue

1 var girth: Double {2     get {3         return width * 44     }5     set {6         width = newValue / 47     }8 }9 s.girth = 200

說明:

  執行第9行代碼時:第6行中newValue的值就是200

(4)計算屬性的使用注意

  1)因為計算屬性的值不是固定的,因此只能用var修飾計算屬性,不能用let

 1 class Square { 2     var girth: Double { 3         get { 4             return girth 5         } 6         set(newGirth) { 7             girth = newGirth 8         } 9     }10 }

說明:上面的代碼會引發死迴圈,第4行代碼會引發迴圈調用get,第7行代碼會引發迴圈調用set。

2)一個屬性不能既是儲存屬性,又是計算屬性

 1 class Square { 2     var girth: Double = 20.0 { 3         get { 4             return 10.0 5         } 6         set() { 7              8         } 9     }10 }

說明:上面的代碼是錯誤的

(5)唯讀計算屬性

 

什麼是唯讀計算屬性?只提供get,沒有set的計算屬性

 1 class Square { 2     var width: Double = 0.0 3     var girth: Double { 4         get { 5             return width * 4 6         } 7     } 8 } 9 var s = Square()10 s.girth = 200

 

說明:第10行代碼會報錯

  唯讀計算屬性的簡寫。唯讀計算屬性可以省略get關鍵字

1 class Square {2     var width: Double = 0.03     var girth: Double {4         return width * 45     }6 }7 var s = Square()8 s.girth = 200

說明:第8行代碼會報錯

 

5.類型屬性

(1)什麼是類型屬性?

 

用class關鍵字修飾的屬性,就是類型屬性,也可以稱為“類屬性”

 

class修飾的類型屬性只能是計算屬性,不能是儲存屬性

程式碼範例:

1 class Circle {2     class var PI : Double  {3         return 3.144     }5 }

說明:第2行定義的屬性PI,就是一個類型屬性

(2)類型屬性的特點

  一個類只會有一份,類的多個執行個體對象都共用這唯一的一份

  類型屬性的使用:類型屬性不依賴於對象而存在,因此用類名來訪問

  println(Circle.PI)

 

三、屬性監視器

1.什麼是屬性監視器?

有時,需要在屬性值被修改的時候做出響應,這種情況下就可以用屬性監視器

屬性監視器,可以監視屬性值的修改過程 

  計算屬性可以直接在set中監聽屬性值的改變,而儲存屬性沒有set

可以為儲存屬性添加willSet和didSet兩個屬性監視器

(1)willSet:

在設定新的屬性值之前調用

會將新的屬性值作為參數傳入,參數名預設是newValue

(2)didSet:

在設定新的屬性值之後調用

會將舊的屬性值作為參數傳入,參數明預設是oldValue

2.程式碼範例

 1 class Square { 2     var width: Double = 0.0 { 3         willSet { 4             println("willSet---\(newValue)") 5         } 6         didSet { 7             println("didSet---\(oldValue)") 8         } 9     }10 }11 var s = Square()12 s.width = 10

列印結果:

willSet---10.0

didSet---0.0

3.使用注意

1 class Square {2     var width: Double = 0.0 {3         willSet { }4         didSet { width = 20 }5     }6 }7 var s = Square()8 s.width = 109 println(s.width)

代碼說明:

willSet和didSet在屬性初始化過程中不會被調用,只會當屬性的值在初始化之外的地方被設定時被調用

第2行代碼的初始化不會引發willSet和didSet的調用

第8行代碼的賦值會引發willSet和didSet的調用

如果在didSet監視器裡為屬性賦值,這個值會替換之前設定的值

第4行對width屬性進行了再次賦值,覆蓋了第8行賦的值,因此第9行的輸出結果是20

willSet、didSet和set、get不能共存

iOS開發Swift篇—(九)屬性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.