这是在Playground完成的,只是为了简化。
class MyPrivateVar
{
private var priv: String?
}
var myInstance = MyPrivateVar()
myInstance.priv = "Something"
没有编译器警告。事实上,自动完成显示priv
没有问题。
我的理解是,在班级{}的界限之外,我不应该看到私人的任何东西,func
或var
。
我错过了什么吗?
答案 0 :(得分:45)
Swift中的访问修饰符的实现方式与其他语言不同。有三个级别:
private
:只能在特定文件中访问
internal
:只能在模块(项目)中访问
public
:可从任何地方访问
除非另有说明,否则您编写的所有内容默认为internal
。
在测试版4中引入功能时Swift blog had a post about access control,以及Apple's documentation has a chapter。
答案 1 :(得分:8)
注意:此答案适用于Swift 2
Swift编程语言表明:
Swift为您的实体提供三种不同的访问级别 码。这些访问级别是相对于其中的源文件 实体是定义的,也是相对于源文件的模块 属于。
如果您不想使用Swift测试private
访问级别,以下一步一步可能会对您有所帮助。
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
的{{1}}私有财产,因为MySecondClass
和{{ 1}}在同一个文件中(您的 TwoClassesInAFile.swift 文件)。
此外,访问级别也适用于全局变量。例如,如果以下代码是同一 ViewController.swift 文件的一部分,Xcode将不会给出任何编译器错误:
priv
但是,如果您在 ViewController.swift 之外定义MySecondClass
,Xcode将生成错误消息:
使用未解析的标识符'globalPrivate'