一、方法(Method)
mutating
@discardableResult
二、下标(subscript)
sub script
<sup> : 上标 -> 在左上角显示的数字
<sub> : 下标 -> 在右下角显示的数字
下标的细节
结构体、类作为返回值对比
接收多个参数的下标
三、继承(Inheritance)
内存结构
Animal是堆空间的对象 需要占用16个字节,最前面的8个字节用来放类型信息,再往后的8个字节放引用计数相关的东西,在往后才是放age的,而且还有个内存对齐,所以class Animal占32个字节
Dog继承子Animal,相当于把age直接拿到Dog内部,所以还是32个字节
同理,ErHa是把上面的拿到内部,所以是48个字节
重写实例方法、下标
重写类型方法、下标
但是子类的class可以替换成static
重写属性
-
子类可以将父类的属性(存储、计算)重写为计算属性
-
子类不可以将父类属性重写为存储属性
-
只能重写var属性,不能重写let属性
-
重写时,属性名、类型要一致
-
子类重写后的属性权限不能小于父类属性的权限
->如果父类属性是只读的,那么子类重写后的属性可以是只读的、也可以是可读写的
->如果父类属性是可读写的,那么子类重写后的属性也必须是可读写的
重写实例属性
重写类型属性
属性观察器
final
- 被final修饰的方法、下标、属性,禁止被重写
- 被final修饰的类,禁止被继承
多态
/*
多态的实现原理:
1.OC:Runtime
2.C++:虚表(虚函数表)
Swift中多态的实现原理(比较偏向于C++)
*/
class Animal {
func speak() {
print("Animal speak")
}
func eat() {
print("Animal eat")
}
func sleep() {
print("Animal sleep")
}
}
class Dog: Animal {
override func speak() {
print("Dog speak")
}
override func eat() {
print("Dog eat")
}
func run() {
print("Dog run")
}
}
// 父类指针指向子类对象,多态
var anim: Animal
anim = Animal()
anim.speak()
anim.eat()
anim.sleep()
anim = Dog()
anim.speak()
anim.eat()
anim.sleep()
//anim.run()
网友评论