ios開發swift篇—(九)屬性
一、類的定義
swift與objective-c定義類的區別
objective-c:一般需要2個檔案,1個.h宣告檔案和1個.m實現檔案
swift:只需要1個.swift檔案
swift中類的定義格式
1class
類名
二、屬性
1.什麼是屬性
swift中的屬性(properties),就類似於其他物件導向語言中的成員變數
2.屬性的分類
按照官方文件的說明,屬性可以分為以下幾種
(1)儲存屬性(stored properties)
(2)計算屬性(computed properties)
(3)型別屬性(type properties)
3.儲存屬性
1)簡單說明
儲存屬性:儲存屬性就是儲存在物件(例項)中的乙個變數或者常量
儲存屬性類似於其他物件導向語言中的成員變數
1class
person
說明:person類中定義了3個儲存屬性
2個變數儲存屬性:int型別的age、double型別的height
1個常量儲存屬性:int型別的life
系統並不會自動初始化上面的3個儲存屬性,需要進行手動初始化
2)儲存屬性的讀寫
如何讀寫儲存屬性?
直接通過點運算子(.),就可以讀寫某個物件的儲存屬性
1class
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來標識乙個延遲儲存屬性
1class
person
4 var p =person()
5 println(p.dog)
說明:執行第5行**時,才會去初始化dog屬性,才真正建立了dog物件
延遲儲存屬性的使用注意:延遲儲存屬性必須是變數,不能是常量
延遲儲存屬性的好處:讓某些資源用到時再去載入,避免一些不必要的資源浪費
4.計算屬性
(1)什麼是計算屬性
跟儲存屬性不一樣的是,計算屬性不是直接儲存值,而是提供get和set
get:用來取值,封裝取值的過程
set:用來設值,封裝設值的過程
(2)**示例:
1class
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
1var girth: double
5set8}
9 s.girth = 200
說明:執行第9行**時:第6行中newvalue的值就是200
(4)計算屬性的使用注意
1)因為計算屬性的值不是固定的,因此只能用var修飾計算屬性,不能用let
1class
square
6set
(newgirth) 9}
10 }
說明:上面的**會引發死迴圈,第4行**會引發迴圈呼叫get,第7行**會引發迴圈呼叫set。
2)乙個屬性不能既是儲存屬性,又是計算屬性
1class
square
6set
() 9
}10 }
說明:上面的**是錯誤的
(5)唯讀計算屬性
什麼是唯讀計算屬性?只提供get,沒有set的計算屬性
1class
square 7}
8}9 var s =square()
10 s.girth = 200
說明:第10行**會報錯
唯讀計算屬性的簡寫。
唯讀計算屬性可以省略get關鍵字
1class
square 6}
7 var s =square()
8 s.girth = 200
說明:第8行**會報錯
5.型別屬性
(1)什麼是型別屬性?
用class關鍵字修飾的屬性,就是型別屬性,也可以稱為「類屬性」
class修飾的型別屬性只能是計算屬性,不能是儲存屬性
**示例:
1class
circle
5 }
說明:第2行定義的屬性pi,就是乙個型別屬性
(2)型別屬性的特點
乙個類只會有乙份,類的多個例項物件都共享這唯一的乙份
型別屬性的使用:型別屬性不依賴於物件而存在,因此用類名來訪問
println(circle.pi)
三、屬性監視器
1.什麼是屬性監視器?
有時,需要在屬性值被修改的時候做出響應,這種情況下就可以用屬性監視器
屬性監視器,可以監視屬性值的修改過程
計算屬性可以直接在set中監聽屬性值的改變,而儲存屬性沒有set
可以為儲存屬性新增willset和didset兩個屬性監視器
(1)willset:
在設定新的屬性值之前呼叫
會將新的屬性值作為引數傳入,引數名預設是newvalue
(2)didset:
在設定新的屬性值之後呼叫
會將舊的屬性值作為引數傳入,引數明預設是oldvalue
2.**示例
1class
square
6didset 9}
10}11 var s =square()
12 s.width = 10
列印結果:
willset---10.0
didset---0.0
3.使用注意
1class
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...