对计算属性的Swift访问控制:为什么这有效?

时间:2016-08-24 19:14:50

标签: swift class-visibility

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

$('.border').hover(function() {
    var class_names = $(this).attr('class');

    var class_name = class_names.split( ' ' ); 

    var c = parseInt( class_name[0] );

    console.log( c );
});

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

允许使用顶级作业表达式auto.offset.reset = earliest,因为它在操场上运行。在游乐场外,这种特殊的顶级作业在大多数情况下是非法的(例外!)。

对什么构成“顶级代码”及其适用范围的奖励说明;来自官方Swift博客here

  

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

...

  

你会注意到我们之前说过不允许使用顶级代码   大部分应用的源文件。例外是一个名为的特殊文件   “main.swift”,其行为与游乐场文件非常相似,但是已经构建完成   使用您应用的源代码。 “main.swift”文件可以包含   顶级代码以及依赖于订单的规则也适用。在   效果,在“main.swift”中运行的第一行代码是隐含的   定义为程序的主要入口点。这允许   最小的Swift程序是一行 - 只要该行在   “main.swift”。

答案 1 :(得分:1)

  

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

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

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