【问题标题】:In Swift, what is the difference between the Access modifiers internal and public?在 Swift 中,访问修饰符 internal 和 public 有什么区别?
【发布时间】:2017-06-04 03:52:58
【问题描述】:

Swift 提供 5 种访问修饰符:openpublicinternalfileprivateprivate

我对这些说明符的了解,(主要来自link & link_2

open 表示类和类成员可以在定义模块(目标)内外进行子类化和覆盖。

fileprivate 将实体的使用限制在其定义源文件中。一个文件中的多个类基本上可以访问。

private 将实体的使用限制在其封闭声明中。

现在,对我来说,公共和内部似乎几乎相同:-

public 表示类和类成员只能在定义模块中进行子类化和覆盖(目标)。

internal 使实体能够在定义模块中使用(目标)。此外,如果没有提及其他内容,这恰好是默认说明符。在定义应用或框架的内部结构时,我们通常会使用内部访问。

那么基本上 public 和 internal 有什么不同呢?

这是我在这里的第一个问题,所以如果我错过了任何细节,请告诉我。提前致谢。

【问题讨论】:

  • public 在定义模块之外可见,internal 不可见
  • @user28434 我相信public 仅在定义模块中可见。
  • @user28434,您可以参考上面提到的链接进行确认。
  • 你认为错了,你可以直接参考Apple doc和/或自己在代码中尝试
  • @iCode 你的第二个链接也说:允许其他模块使用公共类和公共成员

标签: swift swift3


【解决方案1】:

您标记为 public 的任何内容都可以在您的应用内部和应用(模块)外部使用。如果您将某些内容标记为 internal 只能在您的应用程序(模块)中使用。这在您开发库(框架)时非常有用,您可以使用 internal 来隐藏库结构。
A.swift 和 B.swift 的公共成员对 C.swift 和 D.swift 可用。唯一的限制是类不能被子类化(它们需要open。) - 我的答案基于@Keaz 和@Alexander。

【讨论】:

    【解决方案2】:

    来自Access Control manual

    开放访问和公共访问使实体可以在任何 来自其定义模块的源文件,以及来自 另一个导入定义模块的模块。您通常使用 指定公共接口时的开放或公共访问 框架。描述了开放访问和公共访问之间的区别 下面。

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

    不同之处在于对其他模块的可见性。

    编辑回答@iCode 评论:

    您不需要所有这些。

    对于最简单的小型单开发应用程序,只需使用默认的internal 就足够了。

    如果您需要正确操作,可以添加 fileprivate/private 访问器以隐藏某些实现。

    如果您正在开发大型应用程序并希望将代码分成模块,或者如果您正在开发库,则需要使用public/open 来创建模块间接口。

    【讨论】:

    • 刚刚从@user28434 提供的链接中获得了这些详细信息。 public 在定义模块之外是可访问(注意只有可访问,没有子类化/覆盖选项)。 open 然而,即使在其模块之外,也提供可访问性和可覆盖性。最后internal 在它自己的模块之外甚至无法访问。但是我想知道我们是否真的会在一个项目中使用这么多不同的类型!
    猜你喜欢
    • 2010-10-11
    • 2015-11-26
    • 2011-01-15
    • 2014-11-03
    • 2021-11-23
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多