-
屬性(類,結(jié)構(gòu)體或枚舉中,某一個(gè)成員變量,就是該類,結(jié)構(gòu)體或枚舉的屬性)
-
存儲(chǔ)屬性
-
存在于類,結(jié)構(gòu)體中,枚舉中不存在,定義屬性時(shí),可以定義屬性的類型,默認(rèn)值.與定義變量常量相同,使用var表明該屬性是變量,let表明該屬性是常量.
class FirstClass { var firstValue:String? var secondValue = 2 let thirdValue = 3 } struct FirstStruct { var firstValue:String? var secondValue = 2 let thirdValue = 3 } //類是引用類型,就算被賦值給一個(gè)常量,也依然可以修改其值 let firstClass = FirstClass() firstClass.secondValue = 3 //報(bào)錯(cuò),結(jié)構(gòu)體是值類型,如果定義為常量,則所有的值都不可以被改變 let firstStruct = FirstStruct(firstValue: "first", secondValue: 3) firstStruct.secondValue = 4
- #####延遲存儲(chǔ)屬性
在成員名前,添加lazy關(guān)鍵字,表明該屬性只會(huì)在使用到的時(shí)候才被創(chuàng)建,由于不是一開始就定義的成員,所以我們必須設(shè)置改成員為變量.lazy屬性線程不安全
class FirstClass { var firstValue:String? lazy var secondValue:Int = { return 2 }() let thirdValue = 3 } let firstClass = FirstClass() firstClass.secondValue
- 計(jì)算屬性(計(jì)算屬性不存儲(chǔ)值,它提供了set與get方法,使我們可以間接的操作其他變量或者屬性,寫法為在計(jì)算屬性的類型后添加尾隨閉包,在閉包中添加set與get方法,set方法中,系統(tǒng)默認(rèn)為我們提供了newValue參數(shù))
//定義一個(gè)結(jié)構(gòu)體 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)
- 只讀計(jì)算屬性(了解OC的,應(yīng)該知道,定義類屬性時(shí),會(huì)有一個(gè)readOnly選項(xiàng),即改屬性只有getter沒有setter,Swift中,對(duì)于計(jì)算屬性同樣提供了只讀選項(xiàng),只要閉包中不提供set方法,即指明該計(jì)算屬性為只讀屬性.同樣的,我們可以省略關(guān)鍵字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
- 注意我們使用只讀計(jì)算屬性時(shí),必須使用var關(guān)鍵字,因?yàn)橹挥凶兞坎拍芨淖冎?br>
- 屬性監(jiān)聽者(屬性擁有監(jiān)聽者,延遲存儲(chǔ)除外,在屬性的值改變時(shí),他們會(huì)被調(diào)起.需要注意非繼承的計(jì)算屬性不需要添加監(jiān)聽者,因?yàn)槲覀兛梢栽谒?code>set方法中監(jiān)聽到屬性的變動(dòng))
- willSet(即將設(shè)置時(shí),跟計(jì)算屬性的set方法一樣,Swift也為其提供了默認(rèn)的newValue)
- didSet(設(shè)置完成后,該方法提供了默認(rèn)值為oldValue,在didSet方法中,對(duì)該屬性的操作不會(huì)重新引起didSet的調(diào)用)
class Obersevers { var number:Int = 0{ willSet { print("將要設(shè)置number為\(newValue)") } didSet { print("number由\(oldValue)變?yōu)閈(number)") } } } let oberse = Obersevers() oberse.number = 10
- 類屬性(類似與OC中的類方法,可以由類直接調(diào)起,使用static定義,若想要讓它的子類可以對(duì)其進(jìn)行重寫,需要使用class關(guān)鍵詞)
class StaticTest { static var number = 10 static var numberTimeFive:Int{ return number * 5 } } print(StaticTest.numberTimeFive) StaticTest.number = 5 print(StaticTest.numberTimeFive)
- 使用閉包或函數(shù)設(shè)置屬性的默認(rèn)值
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)