Swift 3: The difference between Public and Internal access modifiers?

社会主义新天地 提交于 2020-04-05 12:01:38

问题


I read the Apple's reference about access modifiers in Swift 3. I read also about the same on stackoverflow but I didn't get an answer as the person who asked. As I understood correctly, there are four levels:

  1. Open, Public
  2. Internal
  3. Fileprivate
  4. Private

I created the schemes for myself to understand a difference between all these modifiers and uploaded here. As you can see, there are no differences between Public and Internal modifiers.. However they're on different levels. Any idea would be appreciated!


回答1:


Your diagram is just incorrect.

Public members of A.swift and B.swift are available to C.swift and D.swift. The only restriction is that classes can't be subclassed (they would need to be open.




回答2:


  • Internal - This is default access specifier in swift. With this we can access data members and member functions in the same module (target).

  • Public - This is where you can access all data members and member functions within same module and outside of it. But you can't subclass or override outside the module.

  • Open - same as public, only difference is you can subclass or override outside the module.

  • Fileprivate - As the name say's, data members and member functions are accessible within the same file.

  • Private - This is where you can have access within the scope of function body or class.




回答3:


The The Swift Programming Language book from Apple clearly explains these access modifiers:

“Swift provides five different access levels for entities within your code. These access levels are relative to the source file in which an entity is defined, and also relative to the module that source file belongs to.

Open access and public access enable entities to be used within any source file from their defining module, and also in a source file from another module that imports the defining module. You typically use open or public access when specifying the public interface to a framework. The difference between open and public access is described below.

Internal access enables entities to be used within any source file from their defining module, but not in any source file outside of that module. You typically use internal access when defining an app’s or a framework’s internal structure.

File-private access restricts the use of an entity to its own defining source file. Use file-private access to hide the implementation details of a specific piece of functionality when those details are used within an entire file.

Private access restricts the use of an entity to the enclosing declaration. Use private access to hide the implementation details of a specific piece of functionality when those details are used only within a single declaration

Excerpt From: Apple Inc. “The Swift Programming Language (Swift 3.1).” iBooks. https://itun.es/gb/jEUH0.l”




回答4:


Whatever you marked as public can be used within your app and outside of your app(module). If you marked something as internal that can only be used within your app(module). This is very helpful when you're developing a library (framework), you can use internal to hide library structure.




回答5:


•   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, and extension in other file also.


•   Private - Private members and functions are accessible within the same file, within the extension in same file.



回答6:


Depends on access modifier of class, function or property it can be subclassed, overrode, accessible

Access modifier can be applicable for class, field[About], method. Try to access, subclass or override this.

  • Access to field or method is through a class
  • Inheritance. Successor class(subclass) access modifier should be the same or restrict it(except private <-> fileprivate). Successor method(override) access modifier should be the same or expand it

Java access modifiers



来源:https://stackoverflow.com/questions/42897586/swift-3-the-difference-between-public-and-internal-access-modifiers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!