Swift 3:公共访问修饰符和内部访问修饰符之间的区别? [复制]
Posted
技术标签:
【中文标题】Swift 3:公共访问修饰符和内部访问修饰符之间的区别? [复制]【英文标题】:Swift 3: The difference between Public and Internal access modifiers? [duplicate] 【发布时间】:2017-08-11 09:01:36 【问题描述】:我阅读了 Apple 关于 Swift 3 中访问修饰符的参考资料。我在 *** 上也阅读了相同的内容,但我没有像提问的人那样得到答案。按照我的正确理解,有四个级别:
-
公开,公开
内部
文件私有
私人
我为自己创建了方案以了解所有这些修饰符之间的区别并上传了here。如您所见,公共修饰符和内部修饰符之间没有区别。但是它们处于不同的级别。任何想法将不胜感激!
【问题讨论】:
对于 FilePrivate 和 Private 不同的阅读 this blog ,你可以很容易理解 @SunilPrajapati 谢谢。第三层和第四层是明确的。问题只是关于 Open 和 Public 修饰符。 以Click Here和Second Link为例阅读答案 Swift Access Control 【参考方案1】:内部 - 这是 swift 中的默认访问说明符。有了这个我们 可以访问同一模块中的数据成员和成员函数 (目标)。
Public - 在这里您可以访问所有数据成员和成员 在同一模块内部和外部发挥作用。但你不能 子类化或覆盖模块外。
Open - 与 public 相同,唯一的区别是您可以子类化或 在模块外覆盖。
Fileprivate - 顾名思义,数据成员和成员函数 可以在同一个文件中访问。
私人 - 这是您可以在以下范围内访问的地方 函数体或类。
【讨论】:
(Swift 4+) 私有:也可以在扩展中访问 private 不能在扩展中访问。 私有:也可以在扩展中访问,但只能在同一个文件中访问【参考方案2】:您标记为 public 的任何内容都可以在您的应用内和应用(模块)之外使用。 如果您将某些内容标记为 internal 只能在您的应用程序(模块)中使用。这在您开发库(框架)时非常有用,您可以使用 internal 来隐藏库结构。
【讨论】:
好主意。这让我更接近于理解。谢谢。【参考方案3】:Apple 的 The Swift Programming Language 一书清楚地解释了这些访问修饰符:
“Swift 为代码中的实体提供了五种不同的访问级别。这些访问级别与定义实体的源文件相关,也与源文件所属的模块相关。
Open access 和 public access 使实体能够在其定义模块的任何源文件中使用,也可以在导入定义模块的另一个模块的源文件中使用.在指定框架的公共接口时,您通常使用开放或公共访问。开放访问和公共访问之间的区别如下所述。
内部访问 使实体可以在其定义模块的任何源文件中使用,但不能在该模块之外的任何源文件中使用。在定义应用或框架的内部结构时,您通常会使用内部访问。
文件私有 访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用特定功能的实现细节时,使用文件私有访问隐藏这些细节。
私有 访问将实体的使用限制在封闭声明中。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节
摘自:Apple Inc. “Swift 编程语言 (Swift 3.1)。”电子书。 https://itun.es/gb/jEUH0.l”
【讨论】:
【参考方案4】:Swift 访问修饰符
取决于类、函数或属性的访问修饰符,它可以被子类化、覆盖、可访问
访问修饰符可适用于class
、field
[About]、method
。尝试访问、子类化或覆盖它。
class
访问field
或method
继承与开闭原则[About]
扩展、包装
后继class
(子类)访问修饰符应该相同或限制它(private
除外fileprivate
除外)。
后继 method
(override) 访问修饰符应该相同或展开它
[Java access modifiers]
【讨论】:
【参考方案5】:您的图表不正确。
A.swift
和 B.swift
的公共成员可通过 C.swift
和 D.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.
【讨论】:
以上是关于Swift 3:公共访问修饰符和内部访问修饰符之间的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章