美文网首页
Swift4 改进的private访问权限(SE-0169)

Swift4 改进的private访问权限(SE-0169)

作者: LiuTianXiang | 来源:发表于2017-08-28 09:07 被阅读895次

在Swift 3中,SE-0025对访问权限进行了改进,其中:
fileprivate
:用于定义只能在当前文件中访问的符号;
private
:用于定义只能在当前作用域以及子作用域中访问的符号;

绝大多数情况,它们都可以正常工作,但在Swift 3发布近一年之后,开发者发现这样的划分忽略掉了下面这样的场景:
假设,我们有一个机器人类,它有一个表示当前电量的属性:

class Robot {
    private var battery: Double = 0.5
}

在Swift 3里,如果我们要把充电的方法写在extension里,是无法通过编译的:

extension Robot {
    func charge() {
        battery = 1.0 // This will fail in Swift 3
    }
}

因为extension并不在Robot定义的作用域内部,但是像上面这种功能分组又很常见,于是,在Swift 3里,面对这种问题,很多开发者都使用fileprivate来替代private:

class Robot {
    // In Swift 3, sometimes we use `fileprivate`
    // instead of `private` for a larger access
    // scope.
    fileprivate var battery: Double = 0.5
}

但这并不是十全十美的解决方案,因为我们还可以在定义Robot的文件中编写这样的代码:

let r = Robot()
r.battery = 1.0

很明显,我们不应该允许这样的行为。所以,严格意义上说,我们期望的private访问权限要同时满足两个限制:

只在一个类型的“定义范围”中使用,这个范围同时包含了定义本身,以及类型的extension;
所有的extension必须和类型定义在同一个文件中,以防止外部代码也可以直接访问private属性;

而这,就是Swift 4中,对private权限的改进,现在你可以在Robot的定义,以及同文件内的所有extension Robot中,愉快的访问battery属性了:

class Robot {
    private var battery: Double = 0.5
}

extension Robot {
    func charge() {
        // This will sucess in Swift 4
        battery = 1.0
    }
}

let r = Robot()
// This still failed in Swift 4
r.battery = 1.0

原文链接

相关文章

  • Swift4 改进的private访问权限(SE-0169)

    在Swift 3中,SE-0025对访问权限进行了改进,其中:fileprivate:用于定义只能在当前文件中访问...

  • Swift 4 新特性

    改进 private 的访问权限 在 Swift 4 中,extension 也可以访问 private 修饰的属...

  • 改进的private访问权限

    在Swift 3中,SE-0025对访问权限进行了改进,其中: fileprivate:用于定义只能在当前文件中访...

  • 进阶:访问控制权限

    访问控制权限 访问控制权限:private、protected、public、 默认。 private:私有的只...

  • scala:field

    访问权限private(当前类)package权限(java中的默认权限),指定特定包访问private[包名]p...

  • Java Enum

    Enum 的构造器默认访问权限为private,而且只有private 访问权限被允许。使用public修饰,编译...

  • 6、访问权限控制(封装)

    访问权限限制等级,从大到小依次为:public, protected, 包访问权限, private访问权限的控制...

  • Swift2.0迁移到3.0情况记录

    fileprivate替换private: fileprivate是swift新增加的访问控制权限。private...

  • C#基础面试题

    1.简述private、protected、pubic、internal修饰符的访问权限 答: private :...

  • JAVA基础-访问修饰符

    访问权限 Java中有三种访问权限修饰符:private、protected、public,如果不加访问修饰符,表...

网友评论

      本文标题:Swift4 改进的private访问权限(SE-0169)

      本文链接:https://www.haomeiwen.com/subject/sjswdxtx.html