10.屬性
-
屬性
//存儲屬性:存儲屬性會將常量和變量存儲為實例的?部分,只能用于類和結構體。 //計算屬性:計算屬性則是直接計算(而不是存儲)值,可以用于類、結構體和枚舉 //類型屬性:屬性也可以直接與類型本身關聯,這種屬性稱為類型屬性。
-
存儲屬性
1.簡單來說,一個存儲屬性就是存儲在特定類或結構體實例里的一個常量或變量。存儲屬性可以 是變量存儲屬性(?用關鍵字 var 定義),也可以是常量存儲屬性(?用關鍵字 let 定義)。 2.常量結構體實例的存儲屬性 如果創建了一個結構體實例并將其賦值給一個常量,則?法修改該實例的任何屬性,即使被聲明為可變屬性也不?;這種行為是由于結構體屬于值類型。當值類型的實例被聲明為常量的時候,它的所有屬性也就成了常量。屬于引用類型的類則不一樣。把一個引用類型的實例賦給一個常量后,依然可以修改該實例的可變屬性。 let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4) // 該區間表示整數 0,1,2,3 rangeOfFourItems.firstValue = 6 // 盡管 firstValue 是個可變屬性,但這?里里還是會報錯 3.延時加載存儲屬性 延時加載存儲屬性是指當第一次被調用的時候才會計算其初始值的屬性。在屬性聲明前使用 lazy 來標示?個延時加載存儲屬性。注意:必須將延時加載屬性聲明成變量(使用 var 關鍵字),因為屬性的初始值可能在實例構造完成之后才會得到。而常量屬性在構造過程完成之前必須要有初始值,因此無法聲明成延時加載。
-
計算屬性
//計算屬性不直接存儲值,而是提供一個getter和一個可選的setter,來間接獲取和設置其他屬性或變量的值。 必須使用 var 關鍵字定義計算屬性,包括只讀計算屬性,因為它們的值不是固定的。 let 關鍵字只用來聲明常量量屬性,表示初始化后再也無法修改的值。 struct AlternativeRect { var origin = Point() var size = Size() var center: Point { get { let centerX = origin.x + (size.width / 2) let centerY = origin.y + (size.height / 2) return Point(x: centerX, y: centerY) } set { origin.x = newValue.x - (size.width / 2) origin.y = newValue.y - (size.height / 2) } } } //只讀計算屬性:只有 getter 沒有 setter 的計算屬性叫只讀計算屬性。只讀計算屬性總是返回一個值,可以通過點運算符訪問,但不能設置新的值。 //屬性觀察器:屬性觀察器監控和響應屬性值的變化,每次屬性被設置值的時候都會調用屬性觀察器,即使新值和當前值相同的時候也不例外。 willSet 在新的值被設置之前調?,默認參數名稱 newValue didSet 在新的值被設置之后調?,默認參數名 oldValue //全局變量和局部變量 計算屬性和觀察屬性所描述的功能也可以?于全局變量和局部變量。全局變量是在函數、?法、閉包或任何類型之外定義的變量。局部變量是在函數、?法或閉包內部定義的變量。 注意:全局的常量或變量都是延遲計算的,跟 延時加載存儲屬性 相似,不同的地?在于,全局的常 量或變量不需要標記 lazy 修飾符。 局部范圍的常量和變量從不延遲計算。
-
類型屬性
//可以為類型本身定義屬性,?論創建了多少個該類型的實例,這些屬性都只有唯?一份。 這種屬性就是類型屬性。 //使?關鍵字 static 來定義類型屬性。通過點運算符來訪問,通過類型本身來訪問,?不是通過實例。 struct SomeStructure { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { return 1 } } 注意:跟實例的存儲型屬性不同,必須給存儲型類型屬性指定默認值,因為類型本身沒有構造器,也就?法在初始化過程中使用構造器給類型屬性賦值。存儲型類型屬性是延遲初始化的,它們只有在第一次被訪問的時候才會被初始化。即使它們 被多個線程同時訪問,系統也保證只會對其進?一次初始化,并且不需要對其使用 lazy 修 飾符。