swift中的访问控制模型基于模块和源文件的概念,这篇文章我们需要搞清楚一下几个问题:
- swift 访问控制分类
- 注意事项
- 关键字
模块和源文件
swift中一个模块指的是一个framwork或者一个target,我们常见的UIKit
就是一个模块
源文件当然就是指一个代码文件了,swiftController.swift
访问控制分类
-
public
同一模块的所有实体均可访问,不同模块的任何实体 -
internal
同一模块内的任何实体 -
private
同一源文件,而不是同一个类,因为一个原文件爱你可以定义多个类
注意事项
-
默认的访问控制级别为
internal
-
元组中使用最严格的访问控制,如果
internal
和private
,则整个就是private
-
函数的访问级别是由参数和返回参数的访问级别决定,而不是他自身的级别,如:函数 funcA 返回参数的级别为
private
则函数是private
的,必须明确指明其访问级别 -
枚举成员的访问级别和枚举本身一样
-
在继承层次中,子类的访问级别不能高于父类的
但是,可以通过override
来重写父类的函数来提高访问级别 -
常量,变量,属性,下标访问级别是
private
,则需明确限定,另外他们的访问级别也不能高于他所属的类 -
自定义构造函数的访问级别<= 所属类的访问级别,必要构造函数则必须和类的级别一样(你懂得)
-
结构体的访问级别受限于其存储的属性的级别,如果有一个为
private
则该结构体就是private
-
协议继承--如果定义了一个继承自其他协议的新协议,那么新协议拥有的访问级别最高也只能和被继承协议的访问级别相同,采用写协议的类的访问级别是协议的最低级别
-
扩展--你可以在访问级别允许的情况下对类、结构体、枚举进行扩展。扩展成员具有和原始类型成员一致的访问级别。或者,你可以明确指定扩展的访问级别(例如,
private extension
),从而给该扩展中的所有成员指定一个新的默认访问级别。这个新的默认访问级别仍然可以被单独指定的访问级别所覆盖 -
通过扩展添加协议一致性
如果你通过扩展来采纳协议,那么你就不能显式指定该扩展的访问级别了。协议拥有相应的访问级别,并会为该扩展中所有协议要求的实现提供默认的访问级别。 -
泛型
泛型类型或泛型函数的访问级别取决于泛型类型或泛型函数本身的访问级别,还需结合类型参数的类型约束的访问级别,根据这些访问级别中的最低访问级别来确定。 -
类型别名
你定义的任何类型别名都会被当作不同的类型,以便于进行访问控制。类型别名的访问级别不可高于其表示的类型的访问级别。例如,private 级别的类型别名可以作为 public ,internal,private 类型别名,但是 public级别的类型别名只能作为 public类型的别名,不能作为 internal或 private 类型的别名
关键字
private(set)
setter 方法为private
public private(set)
setter为private getter为public
网友评论