Swift Extension(扩展)
2020-09-30 本文已影响0人
西风那个吹呀吹
- Swift中的扩展,类似OC中的分类Category
- 扩展可以为枚举、结构体、类、协议添加新功能
可以添加方法、计算属性、下标、(便捷)初始化器、嵌套类型、协议等
- 扩展不能办到的事情
- 不能覆盖原有的功能
OC中是允许覆盖的,但Swift是安全的,是不允许覆盖的
- 不能添加存储属性
因为存储属性会改变内存结构,但扩展是不允许改变原有结构的
- 不能向已有的属性添加属性观察器
- 不能添加父类
也就是不能在扩展后面书写冒号继承父类(Extension Car : Person),因为继承有可能改变原有类的内存结构,父类的成员变量将来在原有类内存中也有份,内存结构就会改变,所以,不能继承,也就不能添加父类
- 不能添加指定初始化器,不能添加反初始化器
对于Class类来说,指定初始化器是非常重要的,不能额外通过扩展去添加,但可以添加便捷初始化器。
若是Struct结构体类型,不存在指定初始化器和便捷初始化器,没有这概念,也就可以通过扩展添加成员初始化器。
反初始化器是只能写在原有类里面的,只能有一个,不能在扩展中添加。
- required初始化器不能写在扩展中,必须在原有类中
实用案例:
//添加数组下标越界处理的扩展方法
extension Array {
subscript(nullable idx: Int) ->Element? {
if (startIndex ..< endIndex).contains(idx) {
return self[idx]
}
return nil
}
}
(未完待续)