/*
類屬性的介紹
Swift中類的屬性有多種
1.存儲屬性:存儲示例的常量和變量
2.計算屬性:通過某種方式計算出來的屬性
3.類屬性:與整個類自身相關的屬性
存儲屬性
存儲屬性是最簡單的屬性,它作為類實例的一部分,用於存儲常量和變量
可以給存儲屬性提供一個默認值,也可以在初始化方法中對其進行初始化
*/
class Student{
//存儲屬性
var name:String = ""
var mathScore:Double=0.0
var chineseScore:Double=0.0
//計算屬性-->只讀屬性
var averageScore:Double{
return (chineseScore+mathScore)*0.5
}
//類屬性:和整個類相關的屬性,並且是通過類名進行訪問
static var courseCount:Int=0
// //給類擴充函數
// func getAverageScore()->Double {
// return (chineseScore+mathScore)*0.5
// }
}
let stu=Student()
stu.name="jack"
stu.mathScore=80
stu.chineseScore=90
Student.courseCount=2
print(stu.averageScore)
/*
監聽類屬性的改變
*/
class Person{
var name:String = "aa" {
//選擇其中之一即可
//監聽屬性即將發生改變,還沒有改變
willSet{
print("屬性即將改變\(name)")
}
//監聽屬性已經發生改變,已經發生改變
didSet{
print("屬性發生改變\(name)")
}
}
var age:Int = 0 {//選擇其中之一即可
//監聽屬性即將發生改變,還沒有改變
willSet(newAge2222){
print(newAge2222)
print("屬性即將改變\(age)")
}
//監聽屬性已經發生改變,已經發生改變
didSet(oldAge1){
print(oldAge1)
print("屬性發生改變\(age)")
}
}
}
let p = Person()
p.name="jack"
p.age=100
/*
類的構造函數
*/
class Person2{
var name:String = ""
var age:Int = 0
init(dict:[String:Any]) {
if let name = dict["name"] as? String {
self.name=name
}
if let age = dict["age"] as? Int {
self.age=age
}
}
}
let p2 = Person2(dict: ["name":"jack","age":18])
print(p2.name,p2.age)
/*
使用KVC
1.必須繼承自NSObject
2.必須在構造函數中,先調用suepr.init()
3.調用setValuesForKeys
4.如果字典中某一個key沒有對應的屬性,則需要重寫setValue forUndefinedKey方法
*/
class Person3:NSObject{
@objc var name:String = ""
@objc var age:Int = 0
// MARK:- 自定義構造函數
override init() {
}
init(dict:[String:Any]) {
super.init()
setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forUndefinedKey key: String) {
}
// override func setValue(_ value: Any?, forKey key: String) {
// //print(key)
// }
//重寫析構函數,監聽對象的銷毀
deinit{
print("對象銷毀")
}
}
let p3 = Person3(dict: ["name":"jack22","age":28,"phoneNum":"+86 110"])
print(p3.name,p3.age)