不能在另一个文件的扩展名中使用私有属性

Oni*_*al3 12 ios swift swift3

我不能在扩展中使用私有财产.我的扩展名在另一个文件中.

我怎样才能在扩展中使用私有财产?

nhg*_*rif 17

在您的类型的扩展中使用属性的规则实际上与在其他任何地方使用该属性的规则没有任何不同.

如果声明了属性private,则除了在声明范围之外的任何地方都不能使用它.这意味着即使在同一个文件中也是如此.

如果声明了属性fileprivate,则只能在声明它的文件中(以及该文件中的任何内容)使用它.

如果声明了属性internal(默认值),则只能在声明它的模块中(以及该文件中的任何内容)使用它.

如果属性声明public或者open,它可以通过导入它在声明的模块文件中使用的模块内的任何以及模块之外.

没有办法以这样的方式声明变量,即它可以被类型的扩展使用,但不能被类型之外的其他东西使用.这实际上并不是从Swift 2到Swift 3的变化.情况一直如此.您正在寻找其他语言所称的内容protected.Swift没有,也从未有过protected与其他语言相同的东西.

最接近的是在一个文件中声明一个类型及其所有扩展,并禁止在该文件中声明任何其他类型或类型扩展.然后,您可以将属性标记为fileprivate,并通过该文件中的扩展名使用它们.这仍然不允许在文件之外通过该类型的扩展来使用该属性,并且它不会阻止将来的开发人员在使用该属性的该文件中添加另一种类型或另一种类型的扩展.


Ben*_*itz 7

虽然 @nhgrif 关于 Swift 中缺失的痛苦是正确的protected,但有一种解决方法。

\n\n

用 包裹您的对象protocol,并仅声明您希望公开的方法和属性。

\n\n

例如

\n\n

MyUtiltyClass.swift

\n\n
protocol IMyUtiltyClass {\n    func doSomething()\n}\n\nclass MyUtiltyClass : IMyUtiltyClass {\n\n    static let shared : IMyUtiltyClass = MyUtiltyClass()\n\n    /*private*/\n    func doSomethingPrivately() {\n\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

MyUtiltyClass+DoSomething.swift

\n\n
extension MyUtiltyClass {\n    func doSomething() {\n        self.doSomethingPrivately()\n        print("doing something")\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,您将对象视为接口类型,而不是直接视为类/结构类型。

\n\n

MyViewController.swift

\n\n
class MyViewController : UIViewController {\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        MyUtiltyClass.shared.doSomething()\n        /*\n         //\xe2\x9a\xa0\xef\xb8\x8f compiler error\n         MyUtiltyClass.shared.doSomethingPrivately()\n         */\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

快乐编码 \xe2\x80\x8d

\n