为什么私人扩展无法访问?

时间:2017-10-22 07:27:39

标签: swift xcode access-control swift4

这是我的 ViewController.swift 文件:

class ViewController: UIViewController {
    private var myInt = 10
}

extension ViewController {
    func printMyInt() {
        print(myInt)
    }
}

虽然如Swift documentation - Access Levels section中所述:

  

私人访问限制实体对封闭的使用   声明,以及中声明的扩展名   相同的文件。使用私有访问来隐藏a的实现细节   仅在使用这些详细信息时的特定功能   在一份声明中。

自从Swift 4发布以来,我认为我能够实现这样的事情(在What's New in Swift - WWDC 2017会话中也有提及),然而,编译器告诉我:

enter image description here

  由于'私人'保护级别

'myInt'无法访问

它与文档中提到的内容不兼容吗?


作为一个简单的快速解决方案,我可以将其声明为:

fileprivate var myInt = 10

但我想知道为什么它会像这样,我误解了文档中提到的内容?或者它是“Xcode”错误(使用9.0.1版本)?

备注 :项目已在较旧的Xcode 8中创建,然后已迁移到Xcode 9。

1 个答案:

答案 0 :(得分:3)

Swift 4 中,private成员 可以访问同一文件中该声明的扩展名,请参阅SE-0169 – Improve Interaction Between private Declarations and Extensions

如果项目已在Xcode 8(使用Swift 3)中创建,那么 Xcode 9将以" Swift 3模式打开它"并设置" Swift语言版本"到" Swift 3.2"。因此更严格的Swift 3限制。

要使私有扩展在同一文件中对扩展名可见, 在构建设置中将Swift语言版本设置为4。 (当然 可能需要对代码进行更多更改。)

更好的是,使用"编辑 - >转换 - >当前的Swift语法......"