如何在Swift类中实现继承
定义基类
- 任何不从另一个类继承的类都是所谓的基类
- Swift类不会从一个通用基类继承。你没有指定特定父类的类都会以基类的形式创建
子类
- 子类是基于现在类创建新类的行为。子类从现有的类继承了一些特征,你可以重新定义它们。你也可以为子类添加新的特征
- 为了表明子类有父类,要把子类写在父类的前面,用冒号分隔
重写
- 子类可以提供它自己的实例方法、类型方法、实例属性,类型属性或下标脚本的自定义实现,否则它将会从父类继承。这就所谓的重写
- 要重写而不是继承一个特征,你需要在你的重写定义前面加上override关键字。这样做说明你打算提供一个重写而不是意外提供了一个相同定义。意外的重写可能导致意想不到的行为,并且任何没有使用override关键字的重写都会在编译时被诊断为错误
访问父类的方法、属性和下标脚本
- 你可以通过使用super前缀访问父类的方法、属性或下标脚本
- 一个命名为someMethod()的重写方法可以通过super.someMethod()在重写方法的实现中调用父类版本的someMethod()方法
- 一个命名为someProperty的重写属性可以通过super.someProperty在重写的getter或setter实现中访问父类版本的someProperty属性
- 一个命名为someIndex的重写下标脚本可以使用super[someIndex]在重写的下标脚本实现中访问父类版本中相同的下标脚本
重写方法
- 可以在子类中重写一个继承的实例或类型方法来提供定制的或替代的方法实现
重写属性的getter和setter
- 可以提供一个自定义的getter(和setter,如果合适的话)来重写任意继承的属性,无论在最开始继承的属性实现为存储属性还是计算属性
重写属性的观察器
- 可以使用属性重写来为继承的属性添加属性观察器。这就可以让你的在继承属性的值改变时得到通知,无论这个属性最初如何实现
- 不能给继承而来的常量存储属性或者只读的计算属性添加属性观察器。这些属性的值不能被设置,所以提供willSet或didSet实现作为重写的一部分也是不合适的
- 不能为同一个属性同时提供重写的setter和重写的属性观察器。如果你想要监听属性值的改变,并且你已经为那个属性提供了一个自定义的setter, 那么你从自定义的setter里就可以监听任意值的改变
阻止重写
- 可以通过标记为final来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或者下标脚本的关键字前写final修饰符(比如final var,final func,final class func,final subscript)
如何在Swift中实现多态和进行类型转换
类型
类型检查
- 使用类型检查操作符(is)来检查一个实例是否属于一个特定的子类。如果实例时该子类类型,类型检查操作符返回true,否则返回false
向下类型转换
- 某个类类型的常量或变量可能实际上在后台引用自一个子类的实例。当你遇到这种情况时你可以尝试使用类型转换操作符(as?或as!)将它向下类型转换至其子类类型
- 由于向下类型转换可能失败,类型转换操作符就有了两个不同形式。条件形式,as?,返回了一个你将要向下类型转换的值得可选项。强制形式,as!,则将向下类型转换和强制展开结合为一个步骤
foriteminarray { ifletrealItem=itemas?Movice { print(realItem.director) } }
Any和AnyObject
- Swift为不确定的类型提供了两种特殊的类型别名
- AnyObject可以表示任何类型的实例
- Any 可以表示任何类型,包括函数类型
嵌套类型
- Swift中的类,结构体和枚举可以进行嵌套,即在某一类型的内部定义类型,这种类型嵌套在Java中称为内部类,在C#中称为嵌套类
- 嵌套类型的能够访问它外部的成员