我似乎对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 );
});
我对其他语言的直觉和经验告诉我,最后一行应该有编译器错误。
我正在学习的书中指出,私有意味着被修改的成员只能从同一个源文件访问。
我可以安全地假设这种情况在大多数项目中通常都是错误的,这只是因为我在操场上运行此代码吗?
是否只能从同一源文件中访问私有成员的语句完全准确?
答案 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本身内访问。