【问题标题】:Swift 3: The difference between Public and Internal access modifiers? [duplicate]Swift 3:公共访问修饰符和内部访问修饰符之间的区别? [复制]
【发布时间】:2017-08-11 09:01:36
【问题描述】:

我阅读了 Apple 关于 Swift 3 中访问修饰符的参考资料。我在 stackoverflow 上也阅读了相同的内容,但我没有像提问的人那样得到答案。按照我的正确理解,有四个级别:

  1. 公开,公开
  2. 内部
  3. 文件私有
  4. 私人

我为自己创建了方案以了解所有这些修饰符之间的区别并上传了here。如您所见,公共修饰符和内部修饰符之间没有区别。但是它们处于不同的级别。任何想法将不胜感激!

【问题讨论】:

  • 对于 FilePrivate 和 Private 不同的阅读 this blog ,你可以很容易理解
  • @SunilPrajapati 谢谢。第三层和第四层是明确的。问题只是关于 Open 和 Public 修饰符。
  • Click HereSecond Link为例阅读答案

标签: swift oop inheritance public internal


【解决方案1】:
  • 内部 - 这是 swift 中的默认访问说明符。有了这个我们 可以访问同一模块中的数据成员和成员函数 (目标)。

  • Public - 在这里您可以访问所有数据成员和成员 在同一模块内部和外部发挥作用。但你不能 子类化或覆盖模块外。

  • Open - 与 public 相同,唯一的区别是您可以子类化或 在模块外覆盖。

  • Fileprivate - 顾名思义,数据成员和成员函数 可以在同一个文件中访问。

  • 私人 - 这是您可以在以下范围内访问的地方 函数体或类。

【讨论】:

  • (Swift 4+) 私有:也可以在扩展中访问
  • private 不能在扩展中访问。
  • 私有:也可以在扩展中访问,但只能在同一个文件中访问
【解决方案2】:

您标记为 public 的任何内容都可以在您的应用内和应用(模块)之外使用。 如果您将某些内容标记为 internal 只能在您的应用程序(模块)中使用。这在您开发库(框架)时非常有用,您可以使用 internal 来隐藏库结构。

【讨论】:

  • 好主意。这让我更接近于理解。谢谢。
【解决方案3】:

Apple 的 The Swift Programming Language 一书清楚地解释了这些访问修饰符:

“Swift 为代码中的实体提供了五种不同的访问级别。这些访问级别与定义实体的源文件相关,也与源文件所属的模块相关。

Open accesspublic access 使实体能够在其定义模块的任何源文件中使用,也可以在导入定义模块的另一个模块的源文件中使用.在指定框架的公共接口时,您通常使用开放或公共访问。开放访问和公共访问之间的区别如下所述。

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

文件私有 访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用特定功能的实现细节时,使用文件私有访问隐藏这些细节。

私有 访问将实体的使用限制在封闭声明中。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节

摘自:Apple Inc. “Swift 编程语言 (Swift 3.1)。”电子书。 https://itun.es/gb/jEUH0.l

【讨论】:

    【解决方案4】:

    Swift 访问修饰符

    取决于类、函数或属性的访问修饰符,它可以被子类化、覆盖、可访问

    访问修饰符可适用于classfield[About]method。尝试访问、子类化或覆盖它。

    • 通过class 访问fieldmethod
    • 继承与开闭原则[About]
      • 扩展、包装
      • 后继class(子类)访问修饰符应该相同或限制它(private除外fileprivate除外)。
      • 后继 method(override) 访问修饰符应该相同或展开

    [Java access modifiers]

    【讨论】:

      【解决方案5】:

      您的图表不正确。

      A.swiftB.swift 的公共成员可通过 C.swiftD.swift 获得。唯一的限制是类不能被子类化(它们必须是open

      【讨论】:

      • 在我看来,作为初学者,这并不明显,但目前我感觉到了不同。谢谢!
      【解决方案6】:
      •   Public - Can be used from any module but can’t be subclassed outside defining module (target).
      
      •   Internal - This is default access modifier in swift. Can be accessible from the defining module (target) only.
      
      •   Open - Can be used from any module and can be subclassed outside defining module (target).
      
      •   Swift 4+
      
      •   Fileprivate - Fileprivate members and functions are accessible within the same file, within the extension in same file
      
      •   Private - Private members and functions are accessible within the same file, within the extension in same file.
      

      【讨论】:

        猜你喜欢
        • 2017-11-11
        • 2017-01-03
        • 2011-01-31
        • 1970-01-01
        • 2019-07-15
        • 2015-11-26
        • 1970-01-01
        • 2021-12-17
        相关资源
        最近更新 更多