一、扩展
1、扩展简介:
Swift中的扩展,类似于OC中的分类(Category)。
2、扩展可以为枚举、结构体、类、协议添加新功能。
a.可以添加方法、计算属性、下标、(便捷)初始化器、嵌套类型、协议等。
3、扩展不能办到的事
a.不能覆盖原有的功能。
b.不能添加存储属性,不能向已有的存储属性添加属性观察器。
c.不能添加父类。
d.不能添加指定初始化器,不能添加反初始化器。
二、协议
- 如果一个类型已经实现了协议的所有要求,但是还没有声明它遵守了这个协议。可以通过扩展让它遵守这个协议。
- 协议可以给协议提供默认实现,也简介实现【可选协议】的效果。
- 扩展可以给协议扩充【协议中从未声明过的方法】
extension TestProtocol{
func test1() {
print("执行了test1方法")
}
func test2() {
print("执行协议中未声明过的方法test2")
}
}
三、访问控制
1、访问控制方面 ,Swift提供了5个不同的访问级别(以下是从高到低排列的)
- open:允许在定义实体的模块、其他模块中访问,允许其他模块进行集成、重写(open只能用在类,类成员上)。
- public:允许在定义实体的模块、其他模块中访问,不允许其他模块进行集成、重写。
- internal:只允许在定义的实体模块中访问,不允许在其他模块中访问。
- fileprivate:只允许在定义实体的源文件中访问。
- private:只允许在定义实体的封闭声明中访问。
2、访问级别使用准则
一个实体不可以被更低访问级别的实体定义,例如:
- 父类≥子类
- 父协议≥子协议
- 变量/常量类型≥变量/常量
3、泛型类型
- 泛型类型的访问级别是
类型的访问级别
以及所有泛型类型参数的访问级别
中最低的那个。(木桶原理)
internal class Car {}
fileprivate class Dog {}
public class Person<T1, T2> {}
//Person<Car,Dog>的最低访问级别是fileprivate
fileprivate var p = Person<Car,Dog>()
4、成员、嵌套类型
- 类型的访问级别会影响成员(属性、方法、初始化器、下标)、嵌套类型的默认访问级别
a.一般情况下,类型为privte或fileprivate,那么成员、嵌套类型默认也是privte或fileprivate。
b.一般情况下,类型为internal或public,那么成员、嵌套类型默认是internal
5、getter、setter
getter、setter默认自动接收他们所属环境的访问级别
可以给setter单独设置一个比getter更低的访问级别,用以限制写的权限。
6、初始化器
- 如果一个public类想在另一个模块调用编译生成的默认无参初始化器,必须显式提供public的无参初始化器,因为public类的默认初始化器是internal级别。
- required初始化器≥它的默认访问级别
- 如果结构体有private\fileprivate的存储实例属性,那么它的成员初始化器也是private\fileprivate,否则默认就是internal
7、枚举类型的case
- 不能给enum的每个case单独设置访问级别
- 每个case自动接收enum的访问级别
public enum定义的case也是public
8、协议
- 协议中定义的要求自动接收协议的访问级别,不能单独设置访问级别。
- 协议实现的访问级别必须≥类型的访问级别,或者≥协议的访问级别。
下面的代码编译无法通过:
public protocol Runnable{
func run()
}
public class PersonOne : Runnable {
func run() {}
}
错误提示:Method 'run()' must be declared public because it matches a requirement in public protocol 'Runnable' (方法run必须声明为public,因为它必须匹配声明为public的协议Runnable)
修改后:
public class PersonOne : Runnable {
public func run() {}
}
9、扩展
- 可以单独给扩展添加成员设置访问级别。
- 如果有显示设置扩展的访问级别,扩展添加的成员自动接收扩展的访问级别。
- 如果没有显示设置扩展的访问级别,扩展添加的成员的默认访问级别,和直接在类型中定义的成员一样。
- 不能给用于遵守协议的扩展显式设置扩展的访问级别。
网友评论