这是在Playground完成的,只是为了简化.
class MyPrivateVar
{
private var priv: String?
}
var myInstance = MyPrivateVar()
myInstance.priv = "Something"
Run Code Online (Sandbox Code Playgroud)
没有编译器警告.事实上,自动完成显示priv没有问题.我的理解是,在班级{}的范围之外,我不应该看到任何私人的东西,func也不应该var.
我错过了什么吗?
Nat*_*ook 46
Swift中的访问修饰符的实现方式与其他语言不同.有三个级别:
private:只能在该特定文件中访问
internal:只能在模块(项目)内访问
public:可从任何地方访问
除非另有说明,否则您写的所有内容都是internal默认的.
在斯威夫特博客有一个关于访问控制后,当功能处于beta 4中引入和苹果的文档中有一章为好.
注意:这个答案适用于Swift 2
Swift编程语言指出:
Swift为代码中的实体提供三种不同的访问级别.这些访问级别与定义实体的源文件相关,也与源文件所属的模块相关.
如果您不想private使用Swift 测试访问级别,以下一步一步可能会对您有所帮助.
1 /创建一个新的Xcode项目.
2 /创建一个文件MyPrivateVar.swift,并在其中添加以下代码:
class MyPrivateVar {
private var priv: String? = nil
}
Run Code Online (Sandbox Code Playgroud)
3 /创建第二个文件MySecondClass.swift,并在其中添加以下代码:
class MySecondClass {
init() {
var myPrivateVar = MyPrivateVar()
myPrivateVar.priv = "some string"
}
}
Run Code Online (Sandbox Code Playgroud)
Xcode会立即给你一个Swift编译器错误信息:
'MyPrivateVar'没有名为'priv'的成员
4 /现在,从项目中删除前两个文件,并创建一个文件TwoClassesInAFile.swift,其中包含以下代码:
class MyPrivateVar {
private var priv : String? = nil
}
class MySecondClass {
init() {
var myPrivateVar = MyPrivateVar()
myPrivateVar.priv = "some string"
}
}
Run Code Online (Sandbox Code Playgroud)
这一次,您将不会收到Swift编译器错误消息,并且您将能够访问因为并且位于同一文件(您的TwoClassesInAFile.swift文件)中MyPrivateVar的priv私有属性.MySecondClassprivMySecondClass
此外,访问级别也适用于全局变量.例如,如果以下代码是同一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()
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果globalPrivate在ViewController.swift外部定义,Xcode将生成错误消息:
使用未解析的标识符'globalPrivate'
| 归档时间: |
|
| 查看次数: |
15405 次 |
| 最近记录: |