Can't use private property in extensions in another file

后端 未结 2 1204
被撕碎了的回忆
被撕碎了的回忆 2021-01-04 01:54

I can\'t use private property in extension. My extension is in another file.

How can I use private property in extension?

相关标签:
2条回答
  • 2021-01-04 02:28

    Update Starting with Swift 4, extensions can access the private properties of a type declared in the same file. See Access Levels.

    If a property is declared private, its access is restricted to the enclosing declaration, and to extensions of that declaration that are in the same file.

    If the property is declared fileprivate, it can only be used within the file it is declared (and by anything in that file).

    If the property is declared internal (the default), it can only be used within the module it is declared (and by anything in that file).

    If the property is declared public or open, it can be used by anything within the module as well as outside of the module by files that import the module it is declared in.

    0 讨论(0)
  • 2021-01-04 02:35

    While @nhgrif is correct about how painful is that protected is missing in Swift, There is a way around.

    Wrap your object with protocol, and declare only about the methods and properties that you wish to expose.

    For Example

    MyUtiltyClass.swift

    protocol IMyUtiltyClass {
        func doSomething()
    }
    
    class MyUtiltyClass : IMyUtiltyClass {
    
        static let shared : IMyUtiltyClass = MyUtiltyClass()
    
        /*private*/
        func doSomethingPrivately() {
    
        }
    }
    

    MyUtiltyClass+DoSomething.swift

    extension MyUtiltyClass {
        func doSomething() {
            self.doSomethingPrivately()
            print("doing something")
        }
    }
    

    And then you treat the object as the interface type and not the class/struct type directly.

    MyViewController.swift

    class MyViewController : UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            MyUtiltyClass.shared.doSomething()
            /*
             //⚠️ compiler error
             MyUtiltyClass.shared.doSomethingPrivately()
             */
        }
    }
    

    Happy Coding

    0 讨论(0)
提交回复
热议问题