Can't use private property in extensions in another file
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.
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