1.屬性簡介swift
在類,結構體,枚舉中都用屬性,屬性將值跟特定的類,結構體,枚舉關聯閉包
。存儲屬性存儲變量或者常量做爲實例的一部分,而計算屬性計算一個值。函數
計算屬性能夠用於類,結構體,枚舉,而存儲屬性只能用於類和結構體spa
,不能用於枚舉。屬性能夠分爲實例屬性和類屬性。orm
2.存儲屬性繼承
struct Point {ci
var x: Int = 1get
var y: Int = 3it
let someValue: Int = 4class
3.常量結構體的存儲屬性
struct Point {
var x: Int
var y: Int
}
let r = Point(x: 3, y: 5)
r.x = 6
r.y = 7//會報錯,由於r爲常量結構體,即便x,y是變量屬性也不能修改
4.延遲存儲屬性
當第一次被調用的時候纔會計算其初始值的屬性。在屬性聲明前使用lazy來標示一個延遲存儲屬性
class a {
init(){
print("init a..")
}
func f1(){
print("f1")
}
}
class b{
lazy var r: a = a()//加上lazy後就不實例化a了,只有調用時才實例化
init(){
print("init b")
}
}
var c = b()
5.計算屬性
計算屬性能夠在類,結構體,枚舉中定義。計算屬性不直接存儲值,而是提供一個getter,setter來間接獲取和設置其餘屬性或者變量的值。
struct Rect {
var w:Double!
var h: Double!
var circle: Double{
get {
return (w+h)*2
}
set{
w = newValue/4
h = newValue/4
print("newvalue=\(newValue)")
}
}
}
var r = Rect(w: 20, h: 40)
print(r.circle)
print(r.h)
print(r.w)
r.circle = 200
print(r.h)
print(r.circle)//circle就是計算屬性
6.便捷setter,計算屬性中setter可選。
7.只讀計算屬性,只有getter沒有setter的計算屬性。
只讀計算屬性老是返回一個值,能夠經過點運算符訪問,但不能設置新的值。
8.屬性觀察器
注意:屬性觀察器監控和響應屬性值的變化,每次屬性被設置值的時候都會調用屬性觀察器,甚至新的值和如今的值相同的時候也不例外。還能夠爲除了延遲存儲屬性以外的其餘存儲屬性添加屬性觀察器,也能夠經過重載屬性的方式爲繼承的屬性添加屬性觀察器。觀察器有willSet:在新的值被設置以前調用和didSet:在新的值被設置以後當即調用
class Animal {
var age:Int = 1{
willSet(newValue){
print("newValue=\(newValue)")
if newValue<=0{
print("false")
}
}
didSet{
print("did set")
}
}
}
var a = Animal()
a.age = 1
a.age = -2
9.全局變量,局部變量
計算屬性和屬性觀察器所描述的模式也能夠用於全局和局部,全局變量是在函數,方法,閉包,任意類型以外定義的變量,局部變量是在內部定義的變量。
10.類型屬性和實例屬性
值類型的存儲型類型屬性能夠是常量或者變量,計算型類型屬性跟實例的計算屬性同樣只能定義成變量屬性
與oc不一樣,在swift中,類型屬性是做爲類型定義的一部分寫在類型最外層的括號內,所以它的做用範圍也就在類型支持的範圍內。
使用關鍵字static來定義類型屬性。在爲類(class)定義計算類型屬性時,可使用關鍵字class來支持子類對父類的實現進行重寫