【问题标题】:Swift access control on computed properties: why does this work? [duplicate]对计算属性的快速访问控制:为什么会这样? [复制]
【发布时间】:2017-01-01 01:34:11
【问题描述】:

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

class Something {
    private (set) var name :String {
    get { return "" }
    set {}
    }
}
var thing = Something();
thing.name = "";

我的直觉和其他语言的经验告诉我,最后一行应该有编译器错误。

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

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

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

【问题讨论】:

标签: swift class-visibility


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    允许使用顶级赋值表达式 thing.name = "";,因为它在操场上运行。在游乐场之外,这种特殊的顶级分配在大多数情况中是非法的(有个例外!)。


    什么是“顶级代码”以及它适用于何处的额外说明;来自 Swift 官方博客here:

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

    ...

    您会注意到,前面我们说过顶级代码不允许在 应用程序的大部分源文件。例外是一个名为的特殊文件 “main.swift”,它的行为很像游乐场文件,但它是内置的 与您的应用程序的源代码。 “main.swift”文件可以包含 顶级代码,以及与顺序相关的规则也适用。在 效果,在“main.swift”中运行的第一行代码是隐式的 定义为程序的主要入口点。这允许 将 Swift 程序最小化为单行——只要该行在 “main.swift”。

    【讨论】:

    • @MartinR:你是对的。我已经更新了我的答案,希望这个编辑就足够了。
    猜你喜欢
    • 2019-05-20
    • 2015-12-28
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多