setter和getter的权限问题
getter本身权限是不能比setter低的
class Person
{
private(set) var val = "123"
private(set) var str:String
{
set { print(newValue) }
get { return "get" }
}
}
var p = Person()
p.val = "456"
print(p.val)
p.str = "123"
print(p.str)
拿这段代码来说,p.val和p.str的set方法调用是会出错的,因为权限只能在person内部访问
比如反过来把set设置为private那样权限就比get低了,所以会报错
初始化器
1.创建一个framework工程,然后创建一个swift类,代码写成如下内容,然后运行得到一个NewFW.framework
2.把这个framework拖到要运行的项目
然后会发现会报错,因为外面是Public或者internal镶嵌里面的类型是internal权限的,其它模块无法访问该模块的internal修饰的属性或者类等
解决办法也简单,就是手动写init并加上Public的权限
import Foundation
public class Person
{
var str:String = ""
public init(str:String)
{
self.str = str
}
}
枚举
枚举在嵌套类型里面比较特殊 ,枚举无法单独给某个case设置权限,单独的case也默认和用enum关键定义的枚举同一权限
协议
协议也无法单独给每个函数或者变量或者说关联属性来设置权限,和枚举一样,协议的内部嵌套属性自动遵守协议的权限
比如这段代码,只可以在外部定义权限,内部是无法单独定义权限
internal protocol Runable {
func go()
}
public class Animal : Runable
{
private func go()
{
}
}
这么写是会报错的,协议的权限就是实现这个协议内容的最小权限必须大于这个嵌套或者这个协议,也就是说这个go函数的访问权限必须大于Animal和Runable,也就是说,最少也得是internal权限
拓展
拓展和上面一样,默认接受拓展最外层的访问级别,也就是定义拓展时候的访问级别,没写权限则参考class的嵌套权限