引入
屬性繼承:子類可以繼承父類的屬性稚疹,包括存儲屬性居灯、計(jì)算屬性和類型屬性,還可以繼承父類的屬性觀察器内狗。
屬性重寫需要遵循一定原則怪嫌,不然就會報(bào)錯(cuò)
屬性重寫原則
重寫使用override關(guān)鍵字
1、無論繼承的是存儲屬性還是計(jì)算屬性柳沙,子類都可以通過提供getter和setter對屬性進(jìn)行重寫
2岩灭、可以將一個(gè)繼承的屬性重寫為一個(gè)讀寫屬性
3、 不可以將繼承來的讀寫屬性重寫為只讀屬性
4赂鲤、如果重寫時(shí)提供了setter方法噪径,一定要提供getter方法
屬性觀察器重寫
1、無論父類有沒有為該屬性添加屬性觀察器数初,子類都可以添加屬性觀察器
2找爱、如果父類已經(jīng)添加了屬性觀察器,當(dāng)屬性發(fā)生變化時(shí)泡孩,父類與子類都會得到通知 父類仍然可以監(jiān)聽到屬性的變化
class Student {
//存儲屬性
var age :Int = 0
var chineseScore :Double = 0.0
var englishScore :Double = 0.0
//計(jì)算屬性
var averageScore :Double {//注意沒有等號
//訪問(獲瘸瞪恪)調(diào)用get
get{
print("get") //只寫這一句為什么報(bào)錯(cuò)?
return (chineseScore + englishScore) / 2 //必須加上return 仑鸥,因?yàn)槟玫揭粋€(gè)值返回练般。
}
//設(shè)置值的時(shí)候
set{
print("set")
print("set\(newValue)")
//千萬不要在這里設(shè)置值 會死循環(huán) 外部參數(shù)起名字newvalue
//self.averageScore = newValue
}
}
//只讀計(jì)算屬性
var averageScore2 :Double {
return (chineseScore + englishScore) / 2
}
//類屬性
static var couseCount = 3
//懶加載屬性
lazy var courses :[String] = {
()->[String] in
print("懶加載屬性")
return ["java", "html", "swift"]
}()//()代表閉包執(zhí)行
//屬性觀察器-有的屬性很重要,我希望關(guān)注每一次賦值的變化锈候。 水晶球: 了解你的過去和將來
//驗(yàn)證willSet和didSet作用
//內(nèi)置變量:newValue oldValue
var name:String = "tt" {
//newValue
willSet{
print("父類willSet被調(diào)用,newValue\(newValue)")
}
//oldValue
didSet{
print("父類didSet被調(diào)用,oldValue\(oldValue)")
}
}
}
//屬性的繼承與重寫
class SeniorStudent : Student{
//子類都可以通過提供getter和setter對屬性進(jìn)行重寫
override var chineseScore: Double{
get{
return 90.5
}
set{
}
}
//不可以將繼承來的讀寫屬性重寫為只讀屬性
override var averageScore: Double{
get{
return 90.5
}
set{
}
}
//如果父類已經(jīng)添加了屬性觀察器薄料,當(dāng)屬性發(fā)生變化時(shí),父類與子類都會得到通知
override var name:String{
//newValue
willSet{
print("子類willSet被調(diào)用,newValue\(newValue)")
}
//oldValue
didSet{
print("子類didSet被調(diào)用,oldValue\(oldValue)")
}
}
}
var seniorStudent = SeniorStudent()
seniorStudent.name = "Wangwu"
計(jì)算屬性常用的地方
這個(gè)功能的重點(diǎn)作用應(yīng)該是在計(jì)算上泵琳。
對于一般的屬性摄职,要么直接存一個(gè),要么直接讀一個(gè)获列,計(jì)算屬性則可以根據(jù)所設(shè)置內(nèi)容谷市,進(jìn)行一些修改或計(jì)算之類的, 比如:
import UIKit
class sample {
var no1 = 0.0, no2 = 0.0
var length = 300.0, breadth = 150.0
var middle:(Double,Double) {
get {
return(length / 2, breadth / 2)
}
// 如果沒有加上括號, 那么默認(rèn)就是 set(newValue) {}
set {
// 可以在set方法里動(dòng)態(tài)修改其他屬性和本屬性
no1 = newValue.0-(length / 2)
no2 = newValue.1-(breadth / 2)
}
// 補(bǔ)充
// set方法也可以寫成
// set(value) {
// no1 = value.0-(length / 2)
// no2 = value.1-(breadth / 2)
// }
}
}
var result = sample()
print(result.middle)
result.middle = (0.0, 10.0)
print(result.no1)
print(result.no2)
var result = sample()
print(result.middle)
result.middle = (0.0, 10.0)
print(result.no1)
print(result.no2)