swift3.0 类的访问控制-fileprivate 和 open

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

相关链接:
http://www.jianshu.com/p/604305a61e57

https://kemchenj.github.io/2016/08/17/2016-08-17/

你可能感兴趣的:(swift3.0 类的访问控制-fileprivate 和 open)