Swift 访问控制注意点

本文详细介绍了Swift中的访问控制规则,包括open、private、fileprivate等关键字的使用限制,以及类、初始化器、枚举、协议和扩展的访问级别设定。重点讨论了如何在不同模块间调用初始化器、实现协议以及扩展中成员的访问权限。同时,文章还涵盖了结构体初始化器的权限规定和枚举case的访问级别自动继承。
摘要由CSDN通过智能技术生成

常见的场景就不说了,说一下注意点

  1. open:只能用在类或者类的成员属性、方法上,不能用在类的初始化器上,也不能用在枚举、结构体上。

  2. 初始化器:

    • 类跨模块调用类的初始化器:如果一个public/open类想在另一个模块调用初始化器(包括编译生成的默认无参初始化器),必须显式提供public的无参初始化器。


      原因: 低于public权限则初始化器无法跨模块访问,初始化最高权限是public,无法用open修饰。

    • 类的required初始化器:required初始化器的访问级别必须大于等于它所属类的访问级别。

    • 结构体初始化器:如果结构体private\fileprivate的存储实例属性,并且此存储实例属性的类型在调用处无访问权限,那么它的成员初始化器也是private\fileprivate,否则默认就是internal。

  3. 枚举:

    • 不能给enum的每个case单独设置访问级别,每个case自动接收enum的访问级别。

    举例: public enum的定义的case也是public的。

  4. 协议:

    • 协议中定义的要求自动接收协议的访问级别,不能单独设置访问级别,public协议定义的要求也是public

    • 协议实现的访问级别必须 ≥ 类型的访问级别,或者 ≥ 协议的访问级别

      可以这么理解: 如果从类的角度考虑,想访问类中的该协议实现方法,则必须 ≥ 该类的类型的访问级别;如果从协议实现的角度考虑,则必须能访问到此协议的要求,访问级别必须 ≥ 协议的访问级别。

    举例:

    // 这里可以编译通过
    public protocol Runnable {
        func run()
    }
    
    class Person: Runnable {
        func run() {
        
        }
    }
    
    // 这里编辑不通过,Person的run()默认internal的
    public protocol Runnable {
        func run()
    }
    
    public class Person: Runnable {
        func run() {
        
        }   
    }
    
  5. 扩展:

    • 如果有显式设置扩展的访问级别,扩展添加的成员自动接收扩展的访问级别

    • 如果没有显式设置扩展的访问级别,扩展添加的成员的默认访问级别,跟直接在类型中定义的成员一样

    • 可以单独给扩展添加的成员设置访问级别

    • 不能给用于遵守协议的扩展显式设置扩展的访问级别

    • 在同一文件中的扩展,可以写成类似多个部分的类型声明

      • 在原本的声明中声明一个私有成员,可以在同一文件的扩展中访问它

      • 在扩展中声明一个私有成员,可以在同一文件的其他扩展中、原本声明中访问它

    //以下代码编译不报错
    public class Person {
        private func run0() {}
        private func eat0() {
            run1()
        }
    }
    
    extension Person {
        private func run1() {}
        private func eat1() {
            run0()
        }
    }
    
    extension Person {
        private func eat2() {
            run1()
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值