IOS面试题——Swift扩展(10)

一 面试题汇总

  1. Swift中扩展与OC中分类有什么区别?能添加什么,不能添加什么?
  2. Swift中扩展不能添加指定初始化器,不能添加反初始化器
  3. 结构体自定义初始化器时不会生成默认初始化器。但是可以通过扩展实现两者同时存在
  4. 扩展可以给协议提供默认实现,也间接实现可选协议的效果
  5. 扩展可以给协议扩充协议中从未声明过的方法
  6. 扩展中依然可以使用原类型中的泛型类型

二 面试题解答(仅供参考)

2.1 Swift中扩展与OC中分类有什么区别?能添加什么,不能添加什么?

1
2
Swift 扩展比 Objective-C 分类更强大,它允许你为类、结构体、枚举等添加新的功能,并能遵守新的协议。
Objective-C 分类功能较为简单,主要用于给类添加新方法,且不支持添加存储属性或构造器。

图表

特性 Swift 扩展 Objective-C 分类
可以添加方法
可以添加计算属性
可以添加存储属性
可以添加构造器
可以添加协议遵循
可以重写方法
访问私有成员 只能通过运行时特性(如@objc)访问 只能通过运行时特性(如@objc)访问

2.2 Swift中扩展不能添加指定初始化器,不能添加反初始化器

1
2
扩展不能添加指定初始化器,因为它们可能会影响类的初始化过程。
扩展不能添加反初始化器,因为反初始化器是与对象生命周期紧密相关的,只能在类的定义中声明。

2.3 结构体自定义初始化器时不会生成默认初始化器。但是可以通过扩展实现两者同时存在

1
2
当你为结构体定义了自定义初始化器时,Swift 不会自动生成默认初始化器。
你可以通过扩展来为结构体添加默认初始化器,达到自定义初始化器和默认初始化器同时存在的效果。

2.4 扩展可以给协议提供默认实现,也间接实现可选协议的效果

1
2
扩展可以为协议中的方法提供默认实现,从而避免类型每次都必须实现协议中的所有方法。
通过扩展的默认实现,你可以模拟协议的可选方法,使得协议中的某些方法变得可以选择性地实现。

2.5 扩展可以给协议扩充协议中从未声明过的方法

1
2
扩展可以为协议添加新的方法、属性等,甚至是协议原本并没有声明过的方法。
这些方法会为符合协议的类型提供额外的功能,但并不会改变协议的核心要求。

2.6 扩展中依然可以使用原类型中的泛型类型

1
2
在 Swift 中,扩展可以访问原类型中的泛型参数,并且能够在扩展中操作这些泛型类型。
扩展可以为泛型类型提供额外的方法和功能,并且可以通过类型约束限制扩展方法的适用范围。

三 参考

  • 简书—Swift扩展