swift 访问级别

swift的访问范围从大到小有:open, public, internal, fileprivate, private

 

一、private

1、属性和方法:同一文件内的同一个类,也可以是扩展类。如下所示,同一文件内,extension类可以访问 editCount属性

复制代码
class Student {
    private var editCount: Int = 0
}
extension Student {
    func getCurEditCount() -> Int {
        self.editCount += 1
        return self.editCount
    }
}
复制代码

2、类:只能同一个文件内可以进行创建,并且创建出来的实例也需要设为private否则编译的时候就会提示错误

复制代码
private class Student {
    private var editCount: Int = 0
}
extension Student {
    func getCurEditCount() -> Int {
        self.editCount += 1
        return self.editCount
    }
}
private var student = Student()
复制代码

 

二、fileprivate

1、属性和方法:同一文件内的均可访问。如下所示,在同一文件内,虽然editCount被声明为fileprivate 但是外部依旧可以正常访问

class Student {
    fileprivate var editCount: Int = 0
}
var student = Student()
print(student.editCount)

2、类:只能在同一文件内进行创建,并且创建出来的实例需要声明为fileprivate或者private

 

三、internal

internal是默认的权限,如果没有默认的声明访问级别均为internal。internal可以在同一模块内任意访问

 

四、public

public是可以跨模块访问,但是不允许被继承和重写

 

五、open

当声明为open,则跨模块也能被继承和重写。访问范围是最大的

 

总结:

1、一个类被继承,则子类的访问范围不能比父类的大。特殊的地方:在一个文件内,如果父类被声明为private子类可以被声明为fileprivate。因为虽然为private但是访问范围跟fileprivate一样都在本文件内。

2、一个协议被继承,如果子类也是协议则子类的协议访问范围不能比父类大;如果子类不是协议则不用管协议的访问范围。

3、一个实例的访问范围不能比它对应的类大,同样的函数的访问范围不能比它返回的类的访问范围大。比如: private func testClass() -> PrivateClass {.....}  这里PrivateClass访问级别是private 则函数也需要为private。同样的如果 private func testClass(param: PrivateClass) -> PublicClass {.....} 这里testClass虽然返回的是PublicClass , 但是参数是PrivateClass 所以改函数也需要声明为private

4、为属性的setter声明更小的访问范围 public internal(set) var age: Int = 0 该age的get访问是public 但是set的访问范围只有internal 

5、类的默认初始化与类的访问范围一致,默认初始化最大的访问范围是internal, 如果类的访问范围是public,则默认初始化需要显示设为public否则只为internal

 

posted @   LCAC  阅读(128)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2020-05-12 cocos2dx CCTransitionScene
点击右上角即可分享
微信分享提示