Swift 3:公开和内部访问修饰符之间的区别是什么?

18
我阅读了苹果关于Swift 3中访问控制修饰符的参考资料,也在stackoverflow上阅读了相关内容,但没有像提问者那样得到答案。据我所理解,有四个级别:
  1. Open,Public
  2. Internal
  3. Fileprivate
  4. Private
我创建了一些方案以便自己更好地理解这些修饰符之间的区别,并上传到了这里。从图中可以看出,Public和Internal修饰符之间没有区别,但它们处于不同的级别。如有任何想法,敬请赐教!

1
对于FilePrivate和Private的不同,请阅读此博客,您可以轻松理解。 - Sunil Prajapati
@SunilPrajapati 谢谢您。第三和第四级清楚明了。问题只是关于Open和Public修饰符。 - ivanshok
点击此处查看答案示例:链接1链接2 - Sunil Prajapati
Swift 访问控制 - Lal Krishna
6个回答

27
  • 内部访问 - 这是Swift中的默认访问控制。使用此访问控制,我们可以在同一模块(目标)中访问数据成员和成员函数。

  • 公开访问 - 在同一模块内和模块外,您都可以访问所有数据成员和成员函数。但您无法在模块外部进行子类化或重写操作。

  • 开放访问 - 与公开访问相同,唯一的区别是您可以在模块外部进行子类化或重写操作。

  • 文件私有访问 - 正如名称所示,数据成员和成员函数仅在同一文件中可访问。

  • 私有访问 - 这是您仅在函数体或类的作用域内才能访问的地方。


5
(Swift 4+)私有属性也可以在扩展中访问。 - alegelos
私有变量在扩展中无法访问。 - Ahmed Samir
3
私有的:同样可以在扩展中访问,但仅限于同一文件中。 - Vivek Gupta

10
无论您标记为public的内容,都可以在您的应用程序以及模块之外使用。如果您将某些内容标记为internal,则只能在您的应用程序(模块)内部使用。当您开发库(框架)时,使用internal非常有帮助,可以隐藏库结构。

好的想法。它让我更接近理解。谢谢。 - ivanshok

8
苹果公司的《Swift编程语言》一书明确解释了这些访问修饰符:
“Swift为您的代码中的实体提供了五种不同的访问级别。这些访问级别相对于定义实体的源文件,以及相对于该源文件所属的模块。
开放访问和公共访问使实体可以在定义模块的任何源文件中使用,并且也可以在导入定义模块的其他模块的源文件中使用。通常在指定框架的公共接口时使用开放或公共访问。开放访问和公共访问之间的区别在下面描述。
内部访问使实体可以在定义模块的任何源文件中使用,但不能在该模块之外的任何源文件中使用。通常在定义应用程序或框架的内部结构时使用内部访问。
文件私有访问将实体的使用限制为其自己的定义源文件。当这些细节在整个文件中使用时,使用文件私有访问来隐藏特定功能的实现细节。
私有访问将实体的使用限制为封闭声明。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。”

7

Swift访问控制修饰符

根据类、函数或属性的访问控制修饰符,它可以被子类化、重载或访问。

访问控制修饰符可应用于class, field[关于]method。尝试访问、子类化或重载它们。

  • 通过class来访问fieldmethod
  • 继承和开放封闭原则[关于]
    • 扩展、包装器
    • 后继class(子类)的访问控制修饰符应该相同或受限(除了private <-> fileprivate)。
    • 后继method(重载)的访问控制修饰符应该相同或扩展

[Java访问控制修饰符]


3
•   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.

2

你的图表是不正确的。

A.swiftB.swift的公共成员可供C.swiftD.swift使用。唯一的限制是类不能被子类化(它们需要是open)。


作为一个初学者,对我来说并不明显,但是现在我能感受到这种差异。谢谢! - ivanshok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接