IOS面试题——Swift扩展(10)
一 面试题汇总
- Swift中扩展与OC中分类有什么区别?能添加什么,不能添加什么?
- Swift中扩展不能添加指定初始化器,不能添加反初始化器
- 结构体自定义初始化器时不会生成默认初始化器。但是可以通过扩展实现两者同时存在
- 扩展可以给协议提供默认实现,也间接实现可选协议的效果
- 扩展可以给协议扩充协议中从未声明过的方法
- 扩展中依然可以使用原类型中的泛型类型
二 面试题解答(仅供参考)
2.1 Swift中扩展与OC中分类有什么区别?能添加什么,不能添加什么?
1 | Swift 扩展比 Objective-C 分类更强大,它允许你为类、结构体、枚举等添加新的功能,并能遵守新的协议。 |
图表
特性 | Swift 扩展 | Objective-C 分类 |
---|---|---|
可以添加方法 | 是 | 是 |
可以添加计算属性 | 是 | 是 |
可以添加存储属性 | 是 | 否 |
可以添加构造器 | 是 | 否 |
可以添加协议遵循 | 是 | 否 |
可以重写方法 | 是 | 否 |
访问私有成员 | 只能通过运行时特性(如@objc )访问 |
只能通过运行时特性(如@objc )访问 |
2.2 Swift中扩展不能添加指定初始化器,不能添加反初始化器
1 | 扩展不能添加指定初始化器,因为它们可能会影响类的初始化过程。 |
2.3 结构体自定义初始化器时不会生成默认初始化器。但是可以通过扩展实现两者同时存在
1 | 当你为结构体定义了自定义初始化器时,Swift 不会自动生成默认初始化器。 |
2.4 扩展可以给协议提供默认实现,也间接实现可选协议的效果
1 | 扩展可以为协议中的方法提供默认实现,从而避免类型每次都必须实现协议中的所有方法。 |
2.5 扩展可以给协议扩充协议中从未声明过的方法
1 | 扩展可以为协议添加新的方法、属性等,甚至是协议原本并没有声明过的方法。 |
2.6 扩展中依然可以使用原类型中的泛型类型
1 | 在 Swift 中,扩展可以访问原类型中的泛型参数,并且能够在扩展中操作这些泛型类型。 |
三 参考
- 简书—Swift扩展