Swift 2 内部与私有

问题描述 投票:0回答:5

我对内部和私有访问修饰符感到困惑。

文档说:

“内部访问使实体可以在任何源文件中使用 来自其定义模块,但不在该模块之外的任何源文件中 模块。您通常在定义应用程序或应用程序时使用内部访问 框架的内部结构。”

我的想法是,通过内部,如果您在自己的应用程序中,则可以访问所有内容。但这不是真的,因为当我有一个视图控制器时,默认的内部是什么,并且我在该视图控制器上有一个内部函数,我无法从另一个组中的另一个文件访问它(您在 xCode 中创建这些)。

我尝试的是在 A 组中有一个具有方法 foo 的 ViewController,然后在 B 组中我创建了一个如下所示的 ViewController:

let vc: FakeViewController = FakeViewController()
vc.foo()

那么内部仅限于同一组吗?还是我理解错了?

在视图控制器中创建私有方法和 var/let 有用吗?

swift swift2
5个回答
47
投票

@user1007522 你能发布 FakeViewController 的完整源代码吗?您应该可以从 vc 变量访问 foo() 。如果你不这样做,我怀疑这里有其他东西在起作用。

我发现以下定义更容易理解(复制自 UseYourLoaf - Swift 4 Access Levels

Swift 3/4 的五个访问级别

Swift 3 有五个访问级别,控制您可以从哪个源文件或模块访问某些内容。按照从最开放到最受限制的顺序:

  • open
    您可以从定义模块或导入该模块的任何模块中的任何源文件访问开放类和类成员。您可以在其定义模块和导入该模块的任何模块中对开放类进行子类化或覆盖开放类成员。

  • public
    允许与 open 相同的访问 - 任何模块中的任何源文件 - 但具有更严格的子类化和覆盖。您只能在同一模块中对公共类进行子类化。公共类成员只能被同一模块中的子类覆盖。如果您正在编写框架,这一点很重要。如果您希望该框架的用户能够子类化一个类或重写一个方法,您必须将其打开。

  • internal
    允许从定义模块中的任何源文件使用,但不能从该模块外部使用。这通常是默认访问级别。

  • fileprivate
    只允许在定义的源文件中使用。

  • private
    Swift 4:仅允许从 Swift 4 中的封闭声明和 new 到同一源文件中该声明的任何扩展使用 Swift 3:仅允许从封闭声明使用。


13
投票

假设你有3个不同的视图控制器源文件A、B、C 然后 私有:- 如果 A 中的 Intancses 是私有的,则只有 A 的方法可以使用它们 在内部:- 如果 A 比 B 和 C 更内部,则可以轻松使用它们。 这是一个例子:

谢谢


9
投票

内部访问限制对单个应用程序或框架内的文件的访问。

Private 限制对创建对象的单个源文件的访问。

请参阅此链接以获得更深入的解释。

总的来说,如果您的“A 组”和“B 组”位于同一应用程序或框架中,则假设 viewController 允许内部访问,您应该能够访问每个组的方法。


0
投票

更直观的解释:


-1
投票

我的理解是 private 不允许从该类外部访问该变量。然而,有时,就像手势识别器一样,您无法将它们设为私有,因为它们是在幕后需要的。将它们标记为“内部”可以从其他函数中访问它们,但不能直接调用。

我大多数情况下使用内部来保持代码组织,所以我知道这不是面向公众的功能,但它仍然可以使用。

© www.soinside.com 2019 - 2024. All rights reserved.