-
屬性(類,結構體或枚舉中,某一個成員變量,就是該類,結構體或枚舉的屬性)
-
存儲屬性
-
存在于類,結構體中,枚舉中不存在,定義屬性時,可以定義屬性的類型,默認值.與定義變量常量相同,使用var
表明該屬性是變量,let
表明該屬性是常量.
class FirstClass { var firstValue:String? var secondValue = 2 let thirdValue = 3 } struct FirstStruct { var firstValue:String? var secondValue = 2 let thirdValue = 3 } //類是引用類型,就算被賦值給一個常量,也依然可以修改其值 let firstClass = FirstClass() firstClass.secondValue = 3 //報錯,結構體是值類型,如果定義為常量,則所有的值都不可以被改變 let firstStruct = FirstStruct(firstValue: "first", secondValue: 3) firstStruct.secondValue = 4
- #####延遲存儲屬性
在成員名前,添加lazy
關鍵字,表明該屬性只會在使用到的時候才被創建,由于不是一開始就定義的成員,所以我們必須設置改成員為變量.lazy
屬性線程不安全
class FirstClass { var firstValue:String? lazy var secondValue:Int = { return 2 }() let thirdValue = 3 } let firstClass = FirstClass() firstClass.secondValue
- 計算屬性(計算屬性不存儲值,它提供了set
與get
方法,使我們可以間接的操作其他變量或者屬性,寫法為在計算屬性的類型后添加尾隨閉包,在閉包中添加set
與get
方法,set
方法中,系統默認為我們提供了newValue
參數)
//定義一個結構體 struct number { var a = 0 var b = 0 } //定義類 class TestGetSet { var total:Int = 0 var number:number{ get { return self.number } set (newNumber) { total = newNumber.a + newNumber.b } } var number1:number{ get { return self.number } set { total = newValue.a + newValue.b } } } let test = TestGetSet() test.number = number(a: 3, b: 4) print(test.total)
- 只讀計算屬性(了解OC的,應該知道,定義類屬性時,會有一個readOnly
選項,即改屬性只有getter
沒有setter
,Swift中,對于計算屬性同樣提供了只讀選項,只要閉包中不提供set
方法,即指明該計算屬性為只讀屬性.同樣的,我們可以省略關鍵字get
)
struct total { var a:Int = 0 var b:Int = 0 var total:Int{ return a+b } } let test = total(a: 10, b: 10) test.total
- 注意我們使用只讀計算屬性時,必須使用var
關鍵字,因為只有變量才能改變值
- 屬性監聽者(屬性擁有監聽者,延遲存儲除外,在屬性的值改變時,他們會被調起.需要注意非繼承的計算屬性不需要添加監聽者,因為我們可以在它的set
方法中監聽到屬性的變動)
- willSet(即將設置時,跟計算屬性的set方法一樣,Swift也為其提供了默認的newValue
)
- didSet(設置完成后,該方法提供了默認值為oldValue
,在didSet
方法中,對該屬性的操作不會重新引起didSet
的調用)
class Obersevers { var number:Int = 0{ willSet { print("將要設置number為\(newValue)") } didSet { print("number由\(oldValue)變為\(number)") } } } let oberse = Obersevers() oberse.number = 10
- 類屬性(類似與OC中的類方法,可以由類直接調起,使用static
定義,若想要讓它的子類可以對其進行重寫,需要使用class
關鍵詞)
class StaticTest { static var number = 10 static var numberTimeFive:Int{ return number * 5 } } print(StaticTest.numberTimeFive) StaticTest.number = 5 print(StaticTest.numberTimeFive)
- 使用閉包或函數設置屬性的默認值
class SetDefault { var board:[Bool] = { var tempArray = [Bool]() var isBlack = false for i in 1...8 { for j in 1...8 { tempArray.append(isBlack) isBlack = !isBlack } isBlack = !isBlack } return tempArray }() func squareIsBlackAt(row: Int, column: Int) -> Bool { return board[(row * 8) + column] } } let setDefault = SetDefault() setDefault.squareIsBlackAt(row: 2, column: 1)