这是我的 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会话中也有提及),然而,编译器告诉我:
由于'私人'保护级别,'myInt'无法访问
它与文档中提到的内容不兼容吗?
作为一个简单的快速解决方案,我可以将其声明为:
fileprivate var myInt = 10
但我想知道为什么它会像这样,我误解了文档中提到的内容?或者它是“Xcode”错误(使用9.0.1版本)?
备注 :项目已在较旧的Xcode 8中创建,然后已迁移到Xcode 9。
答案 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语法......"