Swift 计算属性的快速访问控制:为什么这样做?

Swift 计算属性的快速访问控制:为什么这样做?,swift,class-visibility,Swift,Class Visibility,我似乎对Swift中的访问控制修饰符有些误解。以下是我在操场上的代码: class Something { private (set) var name :String { get { return "" } set {} } } var thing = Something(); thing.name = ""; 我的直觉和其他语言的经验告诉我,最后一行应该有编译器错误 然而,我从中学习的书指出,private意味着被修改的成员只能从同一个源文件访问 我是否可以

我似乎对Swift中的访问控制修饰符有些误解。以下是我在操场上的代码:

class Something {
    private (set) var name :String {
    get { return "" }
    set {}
    }
}
var thing = Something();
thing.name = "";
我的直觉和其他语言的经验告诉我,最后一行应该有编译器错误

然而,我从中学习的书指出,private意味着被修改的成员只能从同一个源文件访问

我是否可以安全地假设这种情况在大多数项目中通常都是错误的,这仅仅是因为我在操场上运行这段代码

私有成员只能从同一源文件访问的说法是否完全准确

然而,我正在学习的这本书指出,private意味着被修改的成员只能从同一源文件访问。

您的示例是从同一源文件访问它。有什么问题吗


在Swift 3中,
private
变为
fileprivate
,允许从同一文件的任何位置进行访问private具有您期望的行为,其中仅允许在类/struct/enum本身中进行访问。

此规则适用于所有版本的Swift 2。它对您的示例也是有效的,并且有效,因为您的setter代码位于调用setter的同一文件中(如果我正确理解您的示例的话)

顶级赋值表达式
thing.name=“”被允许,因为它正在操场上运行。在操场外,这种特殊的顶级分配在大多数情况下都是非法的(也有例外!)


对“顶级代码”的构成及其适用范围的解释;来自Swift官方博客:

但是,在大多数Swift源代码中不允许使用顶级代码 文件夹。为清楚起见,任何未写入 函数体、类中的函数体或以其他方式封装的函数体 顶级的。我们有这个规则是因为如果允许顶级代码进入 你所有的文件,很难决定从哪里开始 节目

您会注意到,前面我们说过顶级代码不允许在 大多数应用程序的源文件。例外情况是一个名为 “main.swift”,其行为非常类似于游乐场文件,但它是构建的 使用应用程序的源代码。“main.swift”文件可以包含 顶级代码,以及与订单相关的规则也适用。在里面 实际上,在“main.swift”中运行的第一行代码是隐式的 定义为程序的主入口点。这允许 最小Swift程序为一行-只要该行在 “梅因·斯威夫特”


“私人会员只能从同一来源访问”对Swift 2完全准确Swift 3(Xcode 8 beta 6)更改了“私人,比较”的含义。@MartinR谢谢你,将你的评论作为答案发布,我会接受。我不想重复现有的答案:)–实际上你的问题对我来说并不清楚。你的最后一句话是正确的,那你为什么对此感到疑惑呢?你所说的“这种情况在大多数项目中通常是错误的”是什么意思?也可能重复或@MartinR:你是对的。我已经更新了我的答案,希望这个编辑应该足够了。