iOS開發Swift篇 (九)屬性

2021-09-06 17:22:12 字數 4063 閱讀 9445

ios開發swift篇—(九)屬性

一、類的定義

swift與objective-c定義類的區別

objective-c:一般需要2個檔案,1個.h宣告檔案和1個.m實現檔案

swift:只需要1個.swift檔案

swift中類的定義格式

1

class

類名

二、屬性

1.什麼是屬性

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

2.屬性的分類

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

(1)儲存屬性(stored properties)

(2)計算屬性(computed properties)

(3)型別屬性(type properties)

3.儲存屬性

1)簡單說明

儲存屬性:儲存屬性就是儲存在物件(例項)中的乙個變數或者常量

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

1

class

person

說明:person類中定義了3個儲存屬性

2個變數儲存屬性:int型別的age、double型別的height 

1個常量儲存屬性:int型別的life

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

2)儲存屬性的讀寫

如何讀寫儲存屬性?

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

1

class

person

5 var p =person()

6 p.age = 20

7 println("

p的生命是\(p.life), p的年齡是\(p.age)

")

說明:

第5行:建立person物件

第6行:給物件p的age屬性賦值

第7行:訪問物件p的life屬性值和age屬性值

3)延遲儲存屬性

什麼是延遲儲存屬性?

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

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

1

class

person

4 var p =person()

5 println(p.dog)

說明:執行第5行**時,才會去初始化dog屬性,才真正建立了dog物件

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

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

4.計算屬性

(1)什麼是計算屬性

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

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

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

(2)**示例:

1

class

square

10set

(newgirth) 14}

15 }

計算屬性舉例:

1 var s =square()

2 s.width = 10

3println(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

5set8}

9 s.girth = 200

說明:執行第9行**時:第6行中newvalue的值就是200

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

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

1

class

square

6set

(newgirth) 9}

10 }

說明:上面的**會引發死迴圈,第4行**會引發迴圈呼叫get,第7行**會引發迴圈呼叫set。

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

1

class

square

6set

() 9

}10 }

說明:上面的**是錯誤的

(5)唯讀計算屬性

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

1

class

square 7}

8}9 var s =square()

10 s.girth = 200

說明:第10行**會報錯

唯讀計算屬性的簡寫。

唯讀計算屬性可以省略get關鍵字

1

class

square 6}

7 var s =square()

8 s.girth = 200

說明:第8行**會報錯

5.型別屬性

(1)什麼是型別屬性?

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

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

**示例:

1

class

circle

5 }

說明:第2行定義的屬性pi,就是乙個型別屬性

(2)型別屬性的特點

乙個類只會有乙份,類的多個例項物件都共享這唯一的乙份

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

println(circle.pi)

三、屬性監視器

1.什麼是屬性監視器?

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

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

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

可以為儲存屬性新增willset和didset兩個屬性監視器

(1)willset:

在設定新的屬性值之前呼叫

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

(2)didset:

在設定新的屬性值之後呼叫

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

2.**示例

1

class

square

6didset 9}

10}11 var s =square()

12 s.width = 10

列印結果:

willset---10.0

didset---0.0

3.使用注意

1

class

square

4 didset 5}

6}7 var s =square()

8 s.width = 10

9 println(s.width)

**說明:

willset和didset在屬性初始化過程中不會被呼叫,只會當屬性的值在初始化之外的地方被設定時被呼叫

第2行**的初始化不會引發willset和didset的呼叫

第8行**的賦值會引發willset和didset的呼叫

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

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

willset、didset和set、get不能共存

iOS開發Swift篇 (七)函式

一 函式的定義 1 函式的定義格式 1 func 函式名 形參列表 返回值型別 2 形參列表的格式 形參名1 形參型別1,形參名2 形參型別2,3 舉例 計算2個整數的和 1 func sum num1 int,num2 int int 4 沒有返回值的函式 如果函式沒有返回值,有3種寫法 1 fu...

iOS開發Swift篇 (八)函式 2

一 函式型別 函式型別也是資料型別的一種,它由形參型別和返回值型別組成,格式是 形參型別列表 返回值型別 1 func sum num1 int,num2 int intsum函式的函式型別是 int,int int 1 func printline 2printline函式的函式型別有4種表示方法...

iOS開發Swift篇 (八)函式 2

ios開發swift篇 八 函式 2 一 函式型別 函式型別也是資料型別的一種,它由形參型別和返回值型別組成,格式是 形參型別列表 返回值型別 1 func sum num1 int,num2 int intsum函式的函式型別是 int,int int 1 func printline 2 pri...