swift 3.0 增加了两个访问控制的字段:fileprivate 和 open。
fileprivate
swift 原有的private并不是真正的私有,因为一个定义为private的变量,在同文件的其它的类中也能被访问到。
class Dog {
private var dogName = "wangcai"
}
extension Dog{
var getDogName:String {
return dogName
}
}
在使用extension 的时候,我们就能访问到这个private的变量。
但是我们此时想要的是什么?
此时这个private变量是否能被同文件共享还是仅仅私有,如果private 的变量可以为同文件的共享,那么我们想达到文件的私有,就必须让这个类称为一个单独的文件。
swift 3.0 解决了这个问题,增加了新的访问控制的关键字:fileprivate
fileprivate 这个关键字表示文件内的共享,那个private就是比真金还真的私有了,同文件也不能访问。
//fileprivate:文件内的私有,相当于之前的private
//private:类内的私有,离开类或者结构体的作用域就不能被访问了
class Dog {
fileprivate var dogName = "wangcai"
}
extension Dog{
var getDogName:String {
return dogName
}
}
Open
public: 在module范围内可以被继承,在范围外不能被继承只能被访问
open: 在module 范围内可以被override,被import导入到其它的地方之后,不能被override
final: 这个类或者属性再被定义成final之后,任何地方都不能被继承或者修改
open大概有这么几个规则:
一个类可以被声明为 open
一个类不能同时声明 open 和 final
一个 open的类的父类必须也是 open的, 父类的父类也必须会被按照这条规则递归约束
这个主要是区分开 Module 外可访问和 Module 外可被修改这两个概念。
创建dog.framework,并创建dog.swift
//dogNoChild 在module范围外不能被继承,只能被访问
public class dogPublic {
public func dogPublicTest() {}
//类已经定义成不能被继承的,而这个方法不能设置成既可以继承又可以重载的
//下层的权限不能大于上层的权限大小,此种写法是错误的
open func dogOpenTest() {}
//final 保持不变
public final func dogPublicFinalTest() {}
}
//在module 范围外可以被继承
open class dogOpen {
//属性在module范围外不能被重载
public var dogHeight : Int = 0
//此方法不能在module范围外可以被重载
public func dogPublicTest() {}
// 此方法在任何module都可以被重载
open func dogOpenTest() {}
//final 保持不变
public final func dogPublicFinalTest() {}
}
//final 保持不变
public final class dogFinal { }
创建cat.framework 并新建cat.swift,将dog.framework导入工程
import Foundation
import dog
//编译失败,因为dogPublic 的权限是public,在module外只能被访问,不能被继承
class catA : dogPublic { }
//OK ,编译成功
class catB : dogOpen {
//编译失败, 因为dogPublic 是public的,在module范围之外只能被访问,不能被重载
override func dogPublicTest() { }
//OK, 编译成功,open定义的方法在open定义的类中可以被重载
override func dogOpenTest() { }
}
open class catC : dogOpen{
// 编译失败,失败的原因是这个catC的类被定义成open类型
// 在重载open方法的时候,需要声明权限
override func dogOpenTest() { }
// 编译成功,真对上面的修改,指出访问权限
open override func dogOpenTest() { }
}
open class catD : dogOpen{
//显示的指出方法不能被重载
public final override func dogOpenTest() { }
}
总结:
**open:
open 修饰的 class 在 Module 内部和外部都可以被访问和继承
open 修饰的 func 在 Module 内部和外部都可以被访问和重载(override)
**Public:
public 修饰的 class 在 Module 内部可以访问和继承,在外部只能访问
public 修饰的 func 在 Module 内部可以被访问和重载(override),在外部只能访问
**Final:
final 修饰的 class 任何地方都不能不能被继承
final 修饰的 func 任何地方都不能被 Override
网友评论