Swift基础 重写父类已有的方法

重写

重写方法

重写父类已有的方法,需要在方法名前加 override 的关键字。

class Person{
    
    
    var age:Int
    var name:String
    
    init(name:String,age:Int){
    
    
        self.name = name
        self.age = age
    }
}

class Student:Person{
    
    
    var classScore:Dictionary<String,Int> = ["chinese":0]
    override init(name: String, age: Int) {
    
    
        super.init(name: name, age: age)
    }
}

需要注意的是,重写了父类的init构造器需要调用super的构造器方法对父类的属性进行初始化。

重写下标

同样的在下标方法前面添加关键字override即可。

重写属性

只需要在需要重写的属性中提供 getter() 方法和 setter() 方法即可。

class Person{
    
    
    var name : String
    init(personName: String) {
    
    
        name = personName
    }
}

class Student: Person {
    
    
    override var name : String{
    
    
        get{
    
    
            return super.name.appending("_student")
        }
        set{
    
    
            super.name = newValue
        }
    }
    override init(personName: String) {
    
    
        super.init(personName: personName)
    }
    
}

class ViewController: UIViewController {
    
    
    override func viewDidLoad() {
    
    
        super.viewDidLoad()
        let xiaoMingStudent = Student.init(personName: "xiaoMing")
        print(xiaoMingStudent.name)
    }
}

运行结果:

xiaoMing_student

类继承自NSObject

在oc中我们大多数的类都是继承自NSObject 的,NSObject基础类有一个很方便的用法,就是KVC,他可以很方便得为成员属性进行赋值。

相比较在Swift中,创建类就不强制要求继承自NSObject,因为如果有些类不需要用到KVC或者说NSObject类的一些方法,这样还继承自NSObject类的话,就会使得子类过于臃肿。

class Person : NSObject{
    
    
    //没有赋初始值的属性需要在Init方法里面进行初始化赋值
    var name : String
    
    var age : UInt8 = 0
    var height : Float = 160.0
    
    init(personName:String) {
    
    
        name = personName
    }
}

let xiaoMing = Person.init(personName: "xiaoMing")
//因为Person类继承自NSObject,所以可以使用其KVC的功能
xiaoMing.setValuesForKeys(["age":18,"height":182.1])

在开发过程中,我们要给Person类对象赋值用的字典可能不是来自本地的,而是来自服务器的,一般而言,从服务器获取的字典会非常的冗杂,里面可能会包含很多与App业务不相关的字段,比如体重等等,则会有这样的问题:

xiaoMing.setValuesForKeys(["age":18,"height":182.1,"weight":70])

本地的Person是没有weight成员属性的,那么接收这么一个字典进行KVC赋值,在使用中就会导致系统奔溃。

实际上,Swift在NSObject中,对于成员属性以外的字段是在这个方法中进行处理的

func setValue(_ value: Any?, forUndefinedKey key: String) 

如果不想对字典中,成员属性以外的的字段进行处理的话,只需要在这个方法中进行空实现(即什么都不做)即可。

import UIKit

class Person : NSObject{
    
    
    //没有赋初始值的属性需要在Init方法里面进行初始化赋值
    var name : String
    
    var age : UInt8 = 0
    var height : Float = 160.0
    
    init(personName:String) {
    
    
        name = personName
    }
    
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
    
    
        //空实现
    }
}

let xiaoMing = Person.init(personName: "xiaoMing")
//因为Person类继承自NSObject,所以可以使用其KVC的功能
xiaoMing.setValuesForKeys(["age":18,"height":182.1,"weight":70])

猜你喜欢

转载自blog.csdn.net/kkkenty/article/details/124785513