第二十六章 访问控制
7. Initializers (构造器)
自定义构造器的访问级别可以低于或等于其所属类型的访问级别。唯一的例外是请求构造器(required initializer),它的访问级别必须和所属类型的访问级别相同。如同函数或方法的参数,构造器参数的访问级别也不能低于构造器本身的访问级别。
7.1 Default Initializer (默认构造器)
和在默认构造器章节介绍的那样,Swift 会为结构体和类提供一个默认的无参数的构造器,只要它们为所有存储型属性设置了默认初始值,并且未提供自定义的构造器。
默认构造器的访问级别与所属类型的访问级别相同,除非类型的访问级别是public
。如果一个类型被指定为public级别,那么默认构造器的访问级别将为internal
。如果你希望一个 public级别的类型也能在其他模块中使用这种无参数的默认构造器,你只能自己提供一个 public访问级别的无参数构造器。
7.2 Default Memberwise Initializer for Structure Types (结构体的成员逐一构造器)
如果结构体中任意存储型属性的访问级别为private
,那么该结构体默认的成员逐一构造器的访问级别就是private
。否则,这种构造器的访问级别依然是internal
。
如同前面提到的默认构造器,如果你希望一个public
级别的结构体也能在其他模块中使用其默认的成员逐一构造器,你依然只能自己提供一个public
访问级别的成员逐一构造器。
8. Protocols (协议)
如果想为一个协议类型明确地指定访问级别,在定义协议时指定即可。这将限制该协议只能在适当的访问级别范围内被采纳。
协议中的每一个要求都具有和该协议相同的访问级别。我们不能将协议中的要求设置为其他访问级别。这样才能确保该协议的所有要求对于任意采纳者都将可用。
8.1 Protocol Inheritance (协议继承)
如果定义了一个继承自其他协议的新协议,那么新协议拥有的访问级别最高也只能和被继承协议的访问级别相 同。例如,你不能将继承自internal
协议的新协议定义为public
协议。
8.2 Protocol Conformance (遵循协议)
一个协议可以遵循比自己更低的协议,例如,我们可以定义一个public
访问级别的类型,他可以在其他模块中使用,同时他也可以采纳一个internal
访问级别的协议,但是只能在该协议所在的模块中作为符合该协议的类型使用。
遵循了协议可行的访问级别采取了他本身和所采纳协议两者间最低的访问级别。也就是说如果一个类型是public
,采纳的协议是internal
级别,那么采纳了这个协议后,该类型作为符合的类型是,其访问级别也是internal
如果你采纳了协议,那么实现了协议的所有要求后,你必须确保这些实现的访问级别不能低于协议的访问级别。例如,一个public
级别的类型,采纳了internal
级别的协议,那么协议的实现至少也得是internal
级别。
9. Extensions (扩展)
我们可以在访问级别允许的情况下,对类,结构体和枚举进行扩展。扩展成员具有和原始类型成员一致的访问级,例如,扩展一个public或internal的类型,扩展成员具有默认的internal访问级别,和原始类型中的成员的访问级别一致。如果我们扩展到哟个private类型,扩展成员则拥有默认的private访问级别。
或者,我们可以明确指定扩展的访问级别(如,private extension
),从而给扩展中的所有成员置顶一个新的默认访问级别。这个新的默认访问级别仍然可以被单独制定的访问级别所覆盖。
10. Generics (泛型)
泛型类型或泛型函数的访问级别取决于泛型类型或泛型函数本身的访问级别,还需结合类型参数的类型约束的访 问级别,根据这些访问级别中的最低访问级别来确定。
11. Type Aliases (类型别名)
我们定义的任何类型别名都可以当作不同的类型使用,以便于进行访问控制,类型别名的访问级别不可高于其表示的类型的访问级别,例如,private访问级别的类型别名可以作为private,file-private,internal,public或者open类型别名来使用。但是,public访问级别的类型别名只能作为public类型别名来使用。不能作为internal,file-private或者private类型的别名。
完结!2020.08.31