I keep wanting a “protected” access level, but I must also admit that there was 
something really elegant about Swift 2’s access scheme (and I think most of us 
feel like the word ‘fileprivate’ feels out of place).  I was thinking about how 
to mesh those two ideas, and I think I may have come up with a solution.

I propose we replace ‘fileprivate’ with a new ‘hidden’ access level.  Hidden 
would work exactly the same way as fileprivate does now, but adds the 
connotation that what is hidden can also be unhidden.  By adding ‘import hidden 
TypeName’ to another file, that file also gains access to all of the hidden 
items of that type (kind of like if it was in the same file).

        import Foundation

        Struct A {
                private var x:Int
                hidden var y:Int  //This is just like fileprivate, but can also 
be shared with other files

        extension A {
                //y can be accessed here because they are in the same file

        import Foundation
        import hidden A  //This allows the entire file to see A’s hidden 

        extension A {
                //y can be accessed here because of the ‘import hidden’ 

        import Foundation

        extension A {
                //y can NOT be seen or accessed here because it is hidden

I think this is a fairly elegant solution to our protected dilemma, which also 
feels in sync with Swift 2’s file-based scheme.  The key features:
        • Extensions no longer need to be piled in the same file if it is 
getting too long
        • Subclasses can be in their own file, but still have access to the 
necessary parts of their superclass
        • It communicates the author’s intent that the items are not meant to 
be visible to its users, but that it is expected to be used for 
        • It requires an explicit statement ‘import hidden’ to access the 
hidden variables. Safe by default, with override.
        • It is not bound by module boundaries  (i.e. you could use it for 
subclassing classes from an imported module)
        • Roughly the same length as ‘private’ and ‘public’ so various 
declarations packed together are much easier to read (fileprivate breaks 
reading rhythm)  

Worth a formal proposal?


swift-evolution mailing list

Reply via email to