你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 《從零開始學Swift》學習筆記(Day 44)——重寫屬性

《從零開始學Swift》學習筆記(Day 44)——重寫屬性

編輯:IOS開發綜合

重寫實例屬性
    我們可以在子類中重寫從父類繼承來的屬性,屬性有實例屬性和靜態屬性之分,他們在具體實現也是不同的。
    實例屬性的重寫一方面可以重寫getter和setter訪問器,另一方面可以重寫屬性觀察者。
    計算靜態屬性需要使用getter和setter訪問器,而存儲屬性不需要。子類在繼承父類後,也可以通過getter和setter訪問器重寫父類的存儲屬性和計算屬性。
下面看一個示例:

class Person {
    
    var name: String        //存儲屬性
    var age: Int            //存儲屬性
    
    func description() -> String{
        return "\(name) 年齡是: \(age)"
    }
    
    init (name: String, age: Int){
        self.name = name
        self.age  = age
    }
}
 
class Student: Person{
    
    var school: String    
    
    override var age: Int {//重寫屬性前面要添加override關鍵字
        get {
        return super.age   
        }
        set {
        super.age = newValue < 8 ? 8: newValue 
        }
    }                              
       
    convenience init() {
        self.init(name: "Tony", age: 18, school: "清華大學")
    }
    
    init (name: String, age: Int,school: String) {
        self.school = school
        super.init(name: name, age: age)
    }
}
 
let student1 = Student()
print("學生年齡:\(student1.age)")
student1.age = 6
print("學生年齡:\(student1.age)")

    從屬性重寫可見,子類本身並不存儲數據,數據是存儲在父類的存儲屬性中的。
    以上示例是重寫屬性getter和setter訪問器,我們還可以重寫屬性觀察者,代碼如下:

class Person {
    
    var name: String
    var age: Int
    
    func description() -> String{
        return "\(name) 年齡是: \(age)"
    }
    
    init (name: String, age: Int){
        self.name = name
        self.age  = age
    }
}
 
class Student: Person{
    
    var school: String
    
    override var age: Int { //重寫了age屬性觀察者
    willSet {              //如果只關注修改之前的調用,可以只重寫willSet觀察者
        print("學生年齡新值:\(newValue)")
 
    }
    didSet{                //如果只關注修改之後的調用,可以只重寫didSet觀察者
        print("學生年齡舊值:\(oldValue)")
    }
    }                                  
    
    convenience init() {
        self.init(name: "Tony", age: 18, school: "清華大學")
    }
    
    init (name: String, age: Int,school: String) {
        self.school = school
        super.init(name: name, age: age)
    }
}
 
let student1 = Student()
print("學生年齡:\(student1.age)")
Student1.age = 6              
print("學生年齡:\(student1.age)")


代碼Student1.age = 6修改了age屬性,修改前後的輸出結果如下:
學生年齡新值:6
學生年齡舊值:18

重寫靜態屬性
在類中靜態屬性定義使用class或static關鍵字,但是使用哪一個要看子類中是否重寫該屬性。class修飾的屬性可以被重寫,static關鍵字就不能被重寫。

示例代碼如下:
 

class Account {
    
    var amount: Double = 0.0              // 賬戶金額
    var owner: String = ""                   //賬戶名
    
    var interestRate: Double = 0.0668    //利率
    
    //class不能換成static
    class var staticProp: Double {              //靜態屬性staticProp
        return 0.0668 * 1_000_000
    }
    
    var instanceProp: Double {
        return self.interestRate *self.amount
    }
}
 
class TermAccount: Account {
    
    //class換成static
    override class var staticProp: Double {     //重寫靜態屬性staticProp
        return 0.0700 * 1_000_000
    }
}
 
//訪問靜態屬性
print(Account.staticProp) 
print(TermAccount.staticProp)


由於要被重寫所以代碼class var staticProp: Double 中的class不能換成static。代碼overrideclass var staticProp: Double中的靜態屬性staticProp可以使用class或static,除非在TermAccount的子類中重寫屬性staticProp。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved