Swift面试题更新 2026-08-05

请解释 Swift 语言中实现多态性的机制,并阐述 override 关键字在其中的具体作用。

技术原理Swift

考察说明

考察对 Swift 面向对象多态机制及方法重写规则的理解。

回答思路

  1. 【回答框架 1】Swift 的多态性主要通过继承、协议和泛型实现,其中继承结合方法重写是最直观的形式。多态允许同一接口调用根据对象实际类型执行不同实现,编译器在运行时通过动态派发(vtable 或 witness table)确定具体调用。
  2. 【回答框架 2】override 关键字用于子类重写父类的实例方法、类方法、下标或属性。在声明前添加 override,Swift 编译器会检查父类确实存在可重写的声明,否则报错,这提供了编译期安全。子类重写时需保持相同的签名,并可调用 super 来访问父类实现。
  3. 【回答框架 3】对于类方法,静态派发(final 方法或非动态派发)与动态派发不同。标记为 final 的方法或类不允许再被重写,这有助于优化性能(避免动态派发)并保证行为一致。override 与 final 是互斥的。
  4. 【回答框架 4】除了方法重写,Swift 还通过协议扩展为类型提供默认实现,结合协议的动态调度实现多态。重写协议扩展方法并不被强制要求用 override,但需要注意调用关系可能导致的意外行为。
  5. 【回答框架 5】重写时必须保持访问级别不低于父类,且方法特性(如 mutating、throws)需要兼容。如果父类方法定义为 static 或 class(final),则子类不能重写。正确使用 override 能提高代码可维护性,但不能误用,否则会增加理解成本。
  6. 【关键点 1】多态依赖继承、协议或泛型,动态派发是核心机制。
  7. 【关键点 2】override 关键字强制编译器检查父类声明,提高安全性。
  8. 【关键点 3】final 阻止重写,与 override 冲突。
  9. 【关键点 4】重写需保持签名一致,可调用 super。
  10. 【关键点 5】协议扩展默认实现与类重写规则不同。
  11. 【易错点 1】忽略 final 可能导致非预期的性能开销。
  12. 【易错点 2】协议扩展中重写方法可能不触发动态派发,行为与类方法不同。
  13. 【易错点 3】重写时未遵守访问级别或特性约束导致编译错误。