1. 程式人生 > >Swift 中的關鍵字 final和super

Swift 中的關鍵字 final和super

final 關鍵字

可以在定義類和類的成時使用 final 關鍵字 它的含義分別如下

  • 1、在關鍵字class 前新增 final (修飾符) 可以將整個類標為 final ,這個樣的類不可以被繼承,檢視繼承這樣的類會編譯報錯
final class Person {

 }
 class Stu : Person {  //編譯報錯 error: inheritance from a final class 'Person'

 }
  • 2.在類的定義中將方法、屬性、下標指令碼標記為 final 可以防止它們被重寫。只需要在宣告關鍵字前加上 final 修飾即可
class
Person {
final var name : String? final func play() { print("------") } final class var age : Int { return 18 } final class func run() { print("******") } }
class tech : Person {

    override var name : String?  //error: expected declaration

    override
func play() { //error: instance method overrides a 'final' instance method } override class var age : Int { //error: class var overrides a 'final' class var return 20 } override class func run() { //error: class method overrides a 'final' class method } }

super 關鍵字

當子類中重寫父類中的方法,屬性或者下標指令碼,有時在重寫版本中使用已經存在的父類實現會大有益處,比如,可以完善已經實現的行為,或者在一個繼承來的變數中儲存一個修改過的值,訪問父類的成員使用的是 super 字首,

super 的用處

  • 1、訪問父類的屬性,在屬性的getter和setter的重寫中實現,可以通過 super.someProperty 來訪問父類版本的
    someProperty

  • 2、訪問父類的方法,在方法 someMethod()的重寫實現中 可以通過 super.someMethod()來呼叫父類版本的someMethod()

  • 3、訪問父類的下標指令碼,在下標指令碼的重寫實現中,可以通過 super[someIndex] 來訪問父類版本中的相同下標指令碼

class Animal {

    var age = 10
    // 使用Static 修飾的靜態屬性不能被子類重寫
    static var weight : Double = 20

    static func play() {
        print("玩")
    }

    class var height : Double {
        return 30
    }

    func run() {
       print("動物在跑")
    }
    class func eat() {
        print("動物在吃")
    }

}
class Dog : Animal {


    /*
     override static var weight : Double {

     get{
     return 80
     }
     set{

     }
     }
     */

    //error: cannot override static method
    /*
     override static func play() {

     }
     */
    //error: cannot override static method

    override var age: Int {
        get {
          return super.age + 10
        }
        set {
          super.age = newValue - 5
        }
    }

    override class var height : Double {

        get {
          return super.height + 30
        }
        set {
        }
    }

    override func run() {
       super.run()
       print("狗在跑")
    }
    override class func eat() {
        super.eat()
        print("狗在吃")
    }
}

Dog.eat()
Dog.height

let dog = Dog()
dog.run()
dog.age