我似乎误解了Swift中的访问控制修饰符。下面是我在游乐场的代码:
class Something {
private (set) var name :String {
get { return "" }
set {}
}
}
var thing = Something();
thing.name = "";
我的直觉和其他语言的经验告诉我,最后一行应该有一个编译错误。
然而,我正在学习的那本书指出,private意味着被修改的成员只能从同一个源文件访问。
我是否可以安全地假设这种情况在大多数项目中通常是错误的,这仅仅是因为我在操场上运行这段代码?
私有成员只能从同一个源文件访问的说法是完全准确的吗?
此规则对Swift 2的所有版本有效。它对您的示例也是有效的,并且工作是因为您的setter代码在调用setter的同一文件中(如果我正确理解您的示例)。
允许顶级赋值表达式thing.name = "";
,因为它运行在运动场中。在操场之外,这个特殊的顶层赋值在大多数情况下是非法的(有例外!)。
关于什么是"顶级代码"以及它在哪里适用的额外解释;来自Swift官方博客:
然而,顶层代码在你的Swift源代码中是不允许的文件。中未写入的任何可执行语句函数体、类内或以其他方式封装顶级。我们有这个规则是因为如果顶层代码被允许进入你所有的文件,很难决定从哪里开始程序。
…
你会注意到前面我们说顶层代码是不允许的大多数应用程序的源文件。异常是一个特殊的文件" main.swift ",它的行为很像一个游乐场文件,但它是构建的与你的应用程序的源代码。" main.swift "文件可以包含顶级代码和依赖于顺序的规则也同样适用。在实际上,在"main.swift"中运行的第一行代码是隐式的定义为程序的主要入口点。这允许最小的Swift程序是单行-只要那行在"main.swift"。
然而,我正在学习的那本书指出,private意味着被修改的成员只能从同一源文件访问。
你的例子是从同一个源文件访问它。有什么问题吗?
在Swift 3中,private
变成了fileprivate
,允许从同一个文件的任何地方访问。Swift 3中的private
有你期望的行为,在那里访问只允许在类/结构/enum本身