重写
重写方法
重写父类已有的方法,需要在方法名前加 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])