【问题标题】:Swift 2 internal vs privateSwift 2 内部与私有
【发布时间】:2016-05-19 13:22:50
【问题描述】:

我对 internal 和 private 访问修饰符感到困惑。

文档说:

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

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

我尝试的是在 A 组中有一个 foo 方法的 ViewController 然后在 B 组中我创建了一个这样的 ViewController:

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

那么 internal 是否仅限于同一组?还是我理解错了?

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

【问题讨论】:

  • “组”是什么意思?
  • 您可以在 xCode 中创建的组。不知道有没有关系。
  • 组对访问控制没有影响,它们只是组织项目/工作区的工具。文档没有错,所以如果你不能从某个地方访问internal func,那一定是因为它在不同的模块中。
  • 参考下面的链接你会得到正确的描述和一个例子。 developer.apple.com/swift/blog/?id=5

标签: swift swift2


【解决方案1】:

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

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

Swift 3/4 的五个访问级别

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    谢谢

    【讨论】:

      【解决方案3】:

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

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

      请参阅此link 以获得更深入的说明。

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

      【讨论】:

      • 不太对,来自Apples documentation 内部访问使实体可以在其定义的模块的任何源文件中使用,但不能在该模块。一个模块!= 单一的应用程序或框架。引用链接中的语言有点草率。
      • 我猜我的 A 组和 B 组在同一个模块中。它在同一个应用程序中。这就是我觉得模块部分令人困惑的地方。
      • @Mike Pollard 的评论是正确的,组只是 Xcode 中的组织,它们对代码或应用程序没有影响。
      • @zaph:根据this article,应用程序和框架目标是模块的示例。
      【解决方案4】:

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

      我主要使用 internal 来组织我的代码,所以我知道这不是一个面向公众的函数,但它仍然可以使用。

      【讨论】:

      • 不太对。 private 与类无关。它限制对同一源文件 (Swift 2) 或封闭范围 (Swift 3) 的访问。请注意,当您在类定义中声明某些内容时,封闭范围不会扩展到其他 extensions。这样,私有函数在整个类中不可用。
      猜你喜欢
      • 2011-04-18
      • 1970-01-01
      • 2016-07-09
      • 2017-12-22
      • 2014-01-01
      • 2014-06-14
      • 2016-07-10
      • 1970-01-01
      相关资源
      最近更新 更多