iOS 访问控制权限【Swift】

21 篇文章 0 订阅

对于每个语言都有属于自己的访问控制权限
对于Java来说:OC中提供了4个访问控制符: @private @package @protected @public 。
对于iOS开发工程师使用OC语言的来说:OC中提供了4个访问控制符: @private @package @protected @public 。
而对于iOS开发工程师还有一种是使用Swift来🔨代码的,那么对应Swift的访问控制 open, public, internal, fileprivate, private这五个。

open : module以外可以访问、重写或者继承。
public: module以外可以访问、不能重写或者继承。
internal(默认):当前module可用
fileprivate: 当前file可见
private:当前声明区域可见
当你的module的某些类或者方法不想对外提供继承或者重写的权限时可以使用public,而不必使用final。
一个建议是自定义类默认设置为final而不是默认的final(除非有继承的需求),这样可以提高编译速度。

来看看代码

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let a = A.init()
        a.method()
    }
    

}

class A {
    open var opena = 10 //module以外可以访问、重写或者继承。
    public var publicb = 10 //module以外可以访问、不能重写或者继承。
    internal var internalc  = 10 //当前module可用
    fileprivate var fileprivated = 10 // 当前file可见
    private var privatee = 10 //当前声明区域可见
  
}

extension A {
    func method() {
        print(opena)
        print(publicb)
        print(internalc)
        print(fileprivated)
        print(privatee)
    }
}


都在一个model里面 ,没有问题!!
在这里插入图片描述
而这个如果要调用A类里面的成员变量除了用private声明的不可以被调用,其余都有正常被调用。因为private定义为了私有也就只能在A类使用。
在这里插入图片描述
而这时候如果我们把extension放在不同文件里就会发生使用fileprivated声明的变量报错了,'xxxxxx' is inaccessible due to 'fileprivate' protection level就是访问权限问题!!fileprivated也就是文件内私有,也在当前的.switf可用。
在这里插入图片描述
那internal、public和opena如何测试?如何在不同module呢?
先回答最后一个问题,如何在不同Module呢?可以使用打包的方式。那如何打包呢?可以参考小编的打包静态库教程
在这里插入图片描述
首先搞一个静态库静态库里面有一个Utils文件下面对应的类及代码如下:

open class UtilsAA: NSObject {
    
    open var openA = 10
    public var publicB = 199
    var c = 1000
}


public class UtilsBB: NSObject{
    open var openD = 10
    public var publicE = 199
    var F = 1000
}

class UtilsCC: NSObject {
    open var openG = 10
    public var publicH = 199
    var i = 1000
}

CC这边不是用任何访问权限,那么对应的就是默认的internal。在不同的Module下面调用情况如下
在这里插入图片描述
代码如下:

    override func viewDidLoad() {
        super.viewDidLoad()
        let a =  UtilsAA.init()
        print(a.openA)
        print(a.publicB)
        //error: 'c' is inaccessible due to 'internal' protection level
        print(a.c)
        
        let b = UtilsBB.init()
        print(b.openD)
        print(b.publicE)
        //error:'F' is inaccessible due to 'internal' protection level
        print(b.F)
        
        //Cannot find 'UtilsCC' in scope
        let c = UtilsCC.init()
        
    }

也就是如果不使用访问修饰符或者使用了internal修饰符,那么可以在整个module都可以访问的到。
openpublic在module外都可以访问的到,再来说说这两个最大的区别就是能不能被继承和重写。我们不改变静态库里的代码,在使用静态库的地方分别对他进行继承看看效果:
效果如下:
在这里插入图片描述

class UtilsAAAA: UtilsAA {
    func sayNumber()  {
        print(openA)
        print(publicB)
    }
}
//error:Cannot inherit from non-open class 'UtilsBB' outside of its defining module
class UtilsBBBB: UtilsBB{
    func sayNumber()  {
        print(openD)
        print(publicE)
    }
}

Cannot inherit from non-open class ‘UtilsBB’ outside of its defining module中文意思为:无法从其定义模块之外的非开放类“UtilsBB”继承。也就是因为我们的UtilsBB这个类是用Public修饰的,而使用了Public的类在module外是不能被继承的,只有使用open修饰符才能在module外被继承。
再来看看重写的时候open和public的区别,同样的在静态库中增加

open class UtilsDD: NSObject {
    open func UtilsDD_sayHello(){
        print("say hello")
    }
    
    public func UtilsDD_sayHi(){
        print("say Hi")
    }
}

在调用静态库的时候重写里面的方法

class UtilsDDDD: UtilsDD {
    //error: Overriding non-open instance method outside of its defining module
    override func UtilsDD_sayHi() {
        print("Override !!")
    }
    
    override func UtilsDD_sayHello() {
        print("Override !!")
    }
}

在这里插入图片描述

可见,Overriding non-open instance method outside of its defining module也已经告诉我们了,非open对象修饰的是不能被重写的。

都看到这了还不来一个一键三连?????

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,iOS开发中需要使用Wi-Fi的功能需要在应用程序中获取Wi-Fi的权限。获取Wi-Fi权限的步骤如下: 1. 在应用程序的Info.plist文件中添加以下代码,允许应用程序访问Wi-Fi信息: ```xml <key>NSWi-FiUsageDescription</key> <string>需要使用您的Wi-Fi信息来进行某些操作</string> ``` 在字符串中,您可以描述应用程序为什么需要访问Wi-Fi信息。这个描述将显示在系统弹出的权限请求对话框中,让用户知道应用程序为什么需要Wi-Fi权限。 2. 在应用程序中使用系统提供的WiFiManager类来访问Wi-Fi信息。例如,以下代码将检查当前设备是否连接到Wi-Fi网络: ```swift import SystemConfiguration.CaptiveNetwork func getWiFiInfo() -> [AnyHashable: Any]? { var wifiInfo: [AnyHashable: Any]? if let interfaces = CNCopySupportedInterfaces() as NSArray? { for interface in interfaces { if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? { wifiInfo = interfaceInfo as? [AnyHashable: Any] break } } } return wifiInfo } let wifiInfo = getWiFiInfo() if let ssid = wifiInfo?["SSID"] as? String { print("当前连接的Wi-Fi名称为:\(ssid)") } else { print("当前未连接到Wi-Fi网络") } ``` 这段代码使用了SystemConfiguration框架中的CaptiveNetwork类来获取当前设备连接的Wi-Fi网络信息。注意,在使用CaptiveNetwork类时,需要导入SystemConfiguration框架。 希望这些步骤能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值