Swift 2内部与私人

use*_*522 27 swift swift2

我对内部和私有访问修饰符感到困惑.

文档说:

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

我的想法是,如果你在自己的应用程序中,你可以访问所有内容.但事实并非如此,因为当我有一个viewcontroller什么是默认内部并且我在该viewcontroller上有一个内部函数时,我无法从另一个组中的另一个文件访问它(你在xCode中创建它们).

我尝试的是拥有一个ViewAtroller,它在A组中有一个方法foo,然后在组BI中创建了一个ViewController,如下所示:

let vc: FakeViewController = FakeViewController()
vc.foo()
Run Code Online (Sandbox Code Playgroud)

内部是否仅限于同一组?或者我是在解释它错了?

在viewcontroller中创建私有方法和vars/let是否有用?

Mic*_*son 20

@ user1007522你能发布FakeViewController的完整源代码吗?您应该可以从vc变量访问foo().如果你不这样做,我怀疑其他东西在这里发挥作用.

我发现以下定义更容易理解(从UseYourLoaf - Swift 4访问级别复制)

Swift 3/4的五种访问级别

Swift 3有五个访问级别,可以控制从哪个源文件或模块访问某些内容.从最开放到最受限制的顺序:

  • 打开您可以从定义模块中的任何源文件或导入该模块的任何模块访问开放类和类成员.您可以在其定义模块和导入该模块的任何模块中继承开放类或覆盖开放类成员.

  • public允许与open相同的访问 - 任何模块中的任何源文件 - 但具有更严格的子类和覆盖.您只能在同一模块中子类化公共类.公共类成员只能由同一模块中的子类覆盖.如果您正在编写框架,这很重要.如果您希望该框架的用户能够子类化类或覆盖方法,则必须将其打开.

  • internal允许从定义模块中的任何源文件使用,但不允许从该模块外部使用.这通常是默认访问级别.

  • fileprivate只允许在定义的源文件中使用.

  • 私有 Swift 4:允许仅使用封闭声明和Swift 4中的new,在同一源文件中使用该声明的任何扩展Swift 3:允许仅使用封闭声明.


Ben*_*wry 9

内部访问限制对单个应用程序或框架内的文件的访问.

Private限制对创建对象的单个源文件的访问.

请参阅此链接以获得更深入的解释.

总的来说,如果您的"A组"和"B组"在同一个应用程序或框架中,您应该能够访问每个方法,假设viewController允许内部访问.

  • 不太正确,来自[苹果文档](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html)内部访问使实体可以在其定义的任何源文件中使用**模块**,但不在**模块**之外的任何源文件中.模块!=单一的应用程序或框架.引用链接中的语言有点草率. (4认同)

sin*_*dra 7

假设你有3个不同的视图控制器源文件A,B,C然后是私有: - 如果A中的Intancses是私有的,只有A的方法可以在内部使用它们: - 如果A是内部而不是B,C可以很容易地使用它们.这是一个例子: 在此输入图像描述

谢谢