这是在 Playground 中完成的,只是为了简化。
class MyPrivateVar
{
private var priv: String?
}
var myInstance = MyPrivateVar()
myInstance.priv = "Something"
没有编译器警告。事实上,自动完成显示priv
没有问题。我的理解是,在课堂 {} 的边界之外,我不应该能够看到私有的任何东西,func
也不应该看到var
.
我错过了什么吗?
注意:此答案适用于 Swift 2
Swift 编程语言指出:
Swift 为代码中的实体提供了三种不同的访问级别。这些访问级别与定义实体的源文件相关,也与源文件所属的模块相关。
如果你不想private
用 Swift 测试访问级别,下面的一步一步可能会对你有所帮助。
1/ 创建一个新的 Xcode 项目。
2/ 创建一个文件MyPrivateVar.swift,并在其中添加以下代码:
class MyPrivateVar {
private var priv: String? = nil
}
3/ 创建第二个文件MySecondClass.swift,并在其中添加以下代码:
class MySecondClass {
init() {
var myPrivateVar = MyPrivateVar()
myPrivateVar.priv = "some string"
}
}
Xcode 会立即给你一个 Swift 编译器错误信息:
“MyPrivateVar”没有名为“priv”的成员
4/ 现在,从项目中删除之前的两个文件并创建一个文件TwoClassesInAFile.swift,其中包含以下代码:
class MyPrivateVar {
private var priv : String? = nil
}
class MySecondClass {
init() {
var myPrivateVar = MyPrivateVar()
myPrivateVar.priv = "some string"
}
}
这一次,您将不会收到 Swift 编译器错误消息,并且您将能够访问MyPrivateVar
的priv
私有属性,MySecondClass
因为priv
和MySecondClass
在同一个文件中(您的TwoClassesInAFile.swift文件)。
此外,访问级别也适用于全局变量。例如,如果以下代码是同一个ViewController.swift文件的一部分,Xcode 不会给出任何编译器错误:
import UIKit
private var globalPrivate : String? = nil
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
globalPrivate = "some string"
println(globalPrivate)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
但是,如果您在ViewController.swiftglobalPrivate
之外定义,Xcode 将生成错误消息:
使用未解析的标识符“globalPrivate”