屬性
- 屬性將與指定類垫言,結(jié)構(gòu)體,枚舉相關(guān)聯(lián)雹洗。
存儲(chǔ)屬性: 將常量和變量存儲(chǔ)為實(shí)例的一部分。有類林束,結(jié)構(gòu)體提供欠雌。
計(jì)算屬性: 計(jì)算值蹄梢,由類,結(jié)構(gòu)體富俄,枚舉提供禁炒。
屬性觀察:定義屬性觀察器來監(jiān)視屬性的修改,從而進(jìn)行自定義的操作進(jìn)行響應(yīng)蛙酪。
存儲(chǔ)屬性
struct Person {
//以下為變量(var)和常量(let)的存儲(chǔ)屬性
var name: String
let sex: String
let age: Int
}
var people = Person(name: "Bill", sex: "男", age: 20) //這個(gè)people我們使用var聲明的變量齐苛,所以他可以修改他的名字
people.name = "Jack"
people.age = 21 //將會(huì)出錯(cuò)翘盖,因?yàn)樗浅A浚╨et)初始化之后就不能在被改變了
- 恒定結(jié)構(gòu)體實(shí)例
let people = Person(name: "Bill", sex: "男", age: 20)
people.name = "jason" //會(huì)出錯(cuò)
- 由于結(jié)構(gòu)體是一個(gè)值類型桂塞,當(dāng)改值類型被標(biāo)記為常量時(shí)(let),其所有屬性也被標(biāo)記為常量馍驯。對(duì)類是不同的阁危,他們是引用類型,入伏哦將引用類型的實(shí)例分配給常量汰瘫,則人仍可以改變實(shí)例的變量屬性狂打。
懶加載
- 一個(gè)lazy的存儲(chǔ)屬性,它的初始化值第一次調(diào)用時(shí)不會(huì)被計(jì)算混弥。您lazy在聲明之前編寫修飾符趴乡,表示一個(gè)懶惰的存儲(chǔ)屬性。
懶惰屬性必須是變量(var),因?yàn)閷?shí)例初始化完成后蝗拿,無法知道它的初始值晾捏,當(dāng)時(shí)常量必須在對(duì)象初始化時(shí)必須有一個(gè)初始值。因此常量屬性不能被聲明為lazy的哀托。
class Person: NSObject {
var name: String
lazy var tags = ["ios","Web", "Java", "Pyth"] //加入這是一個(gè)有很多數(shù)量的數(shù)組
init(name: String) {
self.name = name
}
}
let people = Person(name: "Bill")
- 這個(gè)時(shí)候tags并不會(huì)被創(chuàng)建惦辛,只有第一次調(diào)用才會(huì)會(huì)創(chuàng)建。
計(jì)算屬性
- 錯(cuò)誤寫法
class Person: NSObject {
var name: String {
get {
return self.name //這樣會(huì)造成遞歸調(diào)用仓手,最終造成程序崩潰
}
set(newName) {
newName.appending("Bill")
}
}
}
- 正確的姿勢(shì)
class Person: NSObject {
private var _name: String!
var name: String {
get {
return self._name //這樣會(huì)造成遞歸調(diào)用胖齐,最終造成程序崩潰
}
set(newName) {
self._name = newName.appending("Bill")
}
}
}
屬性監(jiān)測(cè)
class Person: NSObject {
var name: String = "" {
didSet {
print("已經(jīng)起好名字了")
}
}
}
只讀屬性
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double { //只讀
return width * height * depth
}
}
- 另外一種設(shè)置方法就是使用let,但是這種方法不太靈活
靜態(tài)屬性 Static
使用static聲明的屬性嗽冒,使用改類調(diào)用呀伙,該屬性存儲(chǔ)在靜態(tài)區(qū)。
我們可以使用這個(gè)Static創(chuàng)建一個(gè)單例
class Person: NSObject {
static let sharedInstance = Person()
private override init() {
//防止外界使用init實(shí)例化
}
}
補(bǔ)充
初始化Swift常量
假如現(xiàn)在我們想聲明一個(gè)label, 我們一般會(huì)這樣做添坊。
func createLabel() -> UILabel {
let label = UILabel()
label.text = "Bill"
return label
}
- 當(dāng)然我們也可以通過閉包去初始化
let label: UILabel = {
let label = UILabel()
label.text = "Bill"
return label
}()
- 當(dāng)然我們還可以使用傳入?yún)?shù)的閉包
let label: UILabel = {
$0.text = "Bill"
$0.font = UIFont.systemFont(ofSize: 15)
return $0
}(UILabel())
print(label.text!) // Bill