我对内部和私人访问修饰符感到困惑。
文档说:
“内部访问允许在任何源文件中使用实体 来自他们的定义模块,但不在其他任何源文件中 模块。您通常在定义应用程序或a时使用内部访问权限 框架的内部结构。“
我的想法是,如果你在自己的应用中,你可以访问所有内容。但事实并非如此,因为当我有一个viewcontroller什么是默认内部并且我在该视图控制器上有一个内部函数时,我无法从另一个组中的另一个文件访问它(你在xCode中创建它们) 。
我尝试过的是一个ViewAtroller,它在A组中有一个方法foo,然后在B组中我创建了一个像这样的ViewController:
let vc: FakeViewController = FakeViewController()
vc.foo()
内部是否仅限于同一组?或者我说错了?
在viewcontroller中创建私有方法和vars / let是否有用?
答案 0 :(得分:17)
@ user1007522您可以发布FakeViewController的完整源代码吗?您应该可以从vc变量访问foo()。如果你不这样做,我怀疑其他东西在这里发挥作用。
我发现以下定义更容易理解(从UseYourLoaf - Swift 4 Access Levels复制)
Swift 3/4的五个访问级别
Swift 3有五个访问级别,可以控制从哪个源文件或模块访问某些内容。从最开放到最受限制的顺序:
打开您可以从定义模块中的任何源文件或导入该模块的任何模块访问开放类和类成员。您可以在其定义模块和导入该模块的任何模块中继承开放类或覆盖开放类成员。
public 允许与open相同的访问权限 - 任何模块中的任何源文件 - 但具有更严格的子类化和覆盖。您只能在同一模块中子类化公共类。公共类成员只能由同一模块中的子类覆盖。如果您正在编写框架,这很重要。如果您希望该框架的用户能够对类进行子类化或覆盖方法,则必须将其打开。
内部允许从定义模块中的任何源文件使用,但不能从该模块外部使用。这通常是默认访问级别。
fileprivate只允许在定义的源文件中使用。
私有 Swift 4:允许仅使用封闭声明和Swift 4中的新增内容,在同一源文件中使用该声明的任何扩展名Swift 3:仅允许使用封闭声明。
答案 1 :(得分:9)
内部访问限制对单个应用程序或框架内的文件的访问。
Private限制访问创建对象的单个源文件。
请参阅此link以获得更深入的解释。
总的来说,如果您的" A组"和" B组"假设viewController允许内部访问,你应该能够从相同的应用程序或框架中访问每个方法。答案 2 :(得分:7)
假设您有3个不同的视图控制器源文件A,B,C
然后
在私人中: - 如果A中的Intancses是私有的而不仅仅是A' s方法可以使用它们
在内部: - 如果A是内部而不是B,C可以很容易地使用它们。
这是一个例子:
谢谢
答案 3 :(得分:0)
我的理解是私人不允许从该类外部访问该变量。但是,有时候,与手势识别器一样,您无法将它们设为私有,因为它们是在幕后需要的。将它们标记为"内部"允许从其他函数中访问它们,但不能直接调用它们。
大多数情况下,我使用内部来保持我的代码有条理,所以我知道这不是一个面向公众的功能,但它仍然可以使用。