屬性
1糟需、 存儲屬性
1.1 實例存儲屬性 - 重點掌握
存在于類、結構體中谷朝,枚舉不行
可用var\let定義實例屬性
對于類洲押,創(chuàng)建的let常量實例不能修改let定義的實例存儲屬性,只能修改var定義的變量存儲屬性
對于結構體圆凰,創(chuàng)建的let實例杈帐,不能修改let與var定義的實例存儲屬性。如果創(chuàng)建的是var實例专钉,只能修改var定義的實例存儲屬性(常量值類型挑童,無論是結構體還是枚舉都不能修改,即便它的屬性是變量屬性也不能修改)
引用類型相當于指針跃须,常量指針是不能修改的站叼,但是它所指向的內容可以修改
延遲存儲屬性 [eg: lazy var 屬性名:屬性類型 = 屬性類型() ] 必須定義的同時初始化,在第一次訪問時候,才加載
-
實例屬性訪問方式:實例.實例屬性(如果self能省略不寫 那就不適用self)
-
代碼如下:
// 類 class Employee{ let no: Int = 0 var name: String = "" var job: String? var salary: Double = 0 var dept: Department? } // 結構體 struct Department{ var no: Int = 0 var name: String = "" } // 類 與 結構體的實例化 let emp = Employee() //emp.no = 100 // 編譯錯誤 no是let原因 let dept = Department() // 編譯錯誤 是let的原因 dept.name = "qwe" let emp1 = Employee() emp1.name = "asd" // 正確菇民,類一般用let定義
1.2 靜態(tài)存儲屬性
存在于類(又叫類型屬性static)尽楔、結構體(static)、枚舉(static-不能定義實例存儲屬性)中
在類第练、結構體阔馋、枚舉中定義類似,static var(let) 存儲屬性 = “xxx” 一般都會賦值
靜態(tài)屬性訪問方式:類型名.靜態(tài)屬性 在實例計算屬性內引用必須加類型名复旬,在靜態(tài)計算屬性內引用可以省略類型名或者由self替換
-
代碼如下:
--------------------結構體靜態(tài)存儲屬性--------------- struct Account{ var amount: Double = 0.0 var owner: String = "" static var interestRate: Double = 0.0668 // 靜態(tài)只讀計算屬性 static var staticProp: Double{ return interestRate * 1_000_000 // 相當于Account.interestRate 與 self.interestRate垦缅,此時self代表類型名 } } // 訪問靜態(tài)屬性 Account.interestRate --------------------枚舉靜態(tài)存儲屬性類似--------------- --------------------類靜態(tài)存儲屬性類似-----------------
-
2、 計算屬性
2.1 實例計算屬性
存在于類驹碍、結構體壁涎、枚舉中(Getter無參 + Setter有參 默認為newValue)
不存儲數(shù)據(jù),而是從其他存儲屬性中計算得到數(shù)據(jù)
只讀計算屬性只有Getter沒有Setter(先掌握Getter的簡寫)
self可以用于類志秃、結構體和枚舉類型中怔球,代表當前實例,可用于訪問自身的實例方法與屬性self.rawValue
-
代碼如下:
// 類 class Employee{ let no: Int = 0 var firstName: String = "Tony" var lastName: String = "Guan" var job: String? var salary: Double = 0 // 計算屬性 var fullName: String{ get{ return firstName + "." + lastName } set{ // set(newFullValue) 省略 默認使用newValue字段 var name = newValue.components(separatedBy: ".") // 分割為字符串數(shù)組 firstName = name[0] lastName = name[1] } } // 只讀計算屬性 只有get方法 但是get可以省略 var fullName1: String{ return firstName + "." + lastName } } // end class Employee // 實例化 var emp = Employee() print(emp.fullName) emp.fullName = "123.qwe" print(emp.fullName) ------------------------------------ // 枚舉 enum WeekDays: String{ case Monday = "Mon." case Tuesday = "Tue." case Wednesday = "Wed." case Thursday = "Thu." case Firday = "Fir." // 枚舉的只讀計算屬性 var message: String{ return "Today is " + self.rawValue } } // 枚舉的實例化8』埂>固场!!5L馈O芽纭! var day = WeekDays.Monday print(day.message) -------------------------------- // 打印結果 Tony.Guan 123.qwe Today is Mon.
2.2 靜態(tài)計算屬性
存在于類(static\class)崭歧、結構體(static)隅很、枚舉(static)中
在靜態(tài)計算屬性中不能訪問實例屬性(存儲+計算),但可以訪問其他靜態(tài)屬性率碾。在實例計算屬性中能訪問實例屬性叔营,也能訪問靜態(tài)屬性(可以聯(lián)想到java的實例變量與類變量)
類靜態(tài)計算屬性如果使用static定義,則該屬性不能再子類中被重寫(override)所宰,如果使用class定義绒尊,則該屬性可以被子類重寫。
-
代碼如下:
------結構體的靜態(tài)計算屬性(類枚舉與此類似仔粥,類可用class或者static)---------------- struct Account{ var amount: Double = 0.0 var owner: String = "" static var interestRate: Double = 0.0668 // 靜態(tài)只讀計算屬性 static var staticProp: Double{ return interestRate * 1_000_000 // Account.interestRate與self.interestRate都是正確的 } // 實例只讀屬性 var intanceProp: Double{ return Account.interestRate * amount // Account不能省略婴谱,self.amount寫法也是正確的 } } // 訪問靜態(tài)計算屬性 Account.staticProp ----------------------類的靜態(tài)計算屬性----------------- // static不能override, class可以 class Account1{ var amount: Double = 0.0 var owner: String = "" static var interestRate: Double = 0.0668 // 靜態(tài)只讀計算屬性 static不能被重寫 class var staticProp: Double{ return interestRate * 1_000_000 } // 實例只讀屬性 var intanceProp: Double{ return Account1.interestRate * self.amount } } // 繼承:屬性也被繼承過來了 Account2可以訪問此時Account1的屬性 class Account2: Account1{ // 計算屬性的重寫 override class var staticProp:Double{ return interestRate * 1000000 } }
3件炉、 屬性觀察者-存儲屬性
監(jiān)聽存儲屬性的變化勘究,即便前后變化的值相同,也能監(jiān)聽到
屬性觀察者不能監(jiān)聽延遲存儲屬性和常量存儲屬性的變化, 實例存儲屬性與靜態(tài)存儲屬性可以被監(jiān)聽
屬性觀察者不存在于枚舉中(枚舉沒有存儲屬性的存在)斟冕,存在于類與結構體中
willSet + didSet(默認參數(shù)newValue + oldValue)
-
代碼如下:
class Employee{ let no: Int = 0 var name: String = "Tony"{ // 也可寫成var name: String?{} willSet{ // willSet(newNameValue)也可以 willSet很少用,didSet就能獲得新值與舊值了 print("新值\(newValue)") } didSet{ print("舊值\(oldValue)") } } var job: String? var salary: Double = 0 } // 實例化 var emp = Employee() emp.name = "CBG"
4缅阳、 訪問屬性
- 我的建議最好是靜態(tài)屬性加上類型名磕蛇,實例屬性加上實例名稱(self\實例名---self能省略就不使用)。讀起來更加容易十办。