Ok, I have been thinking all day if I can come up with of a design which would 
still provide scoped private (and keep file-based private) without causing the 
current confusion.  Here is the best I have so far.  I warn you it trades one 
weirdness for another, but at least the new weirdness is progressively 
disclosed, so it should be less problematic:

Swift 4
        • Depreciate ‘private’ with a warning that it will be removed in Swift 5

Swift 5
        • Remove ‘private’ keyword
        • Rename ‘fileprivate’ to ‘local’ with the understanding it now means 
local to the containing submodule
        • If no submodule is declared, the file is its own anonymous submodule
        • A group of files can declare themselves a submodule by each saying 
‘module name’ with the same name somewhere in the file (only one declaration is 
allowed per file)
        • Within the file ‘module { }’ can declare an anonymous module (within 
the braces) nested inside the current module
        • For fun: Stored properties are allowed to be declared within 
extensions in a type’s containing submodule

That ‘module { }' part is the new weirdness, but it should cause less confusion 
overall.  A few points:
        • They could be nested as deep as you like
        • It needs to be anonymous so you aren’t tempted to connect it with 
other submodules (in other files)
        • You could recreate the current behavior of private by wrapping your 
type in a module block
        • …or you could wrap that block around a type and it’s friend
        • …or you could wrap only part of your type (crucial if you want both 
private and fileprivate behavior in the same type)
        • Internal, public, and open would retain their current meanings


Thoughts on this approach?  It isn’t my first choice, but it is much better 
than what we have now.  

It should let you do everything you do now and then some (but with the extra 
complexity tucked away for the most part).  I.e. If you don’t know what 
submodules are, the system appears structurally the same as Swift 2.  You can 
learn about submodules without learning about ‘module {}’.  In exchange, scoped 
private becomes more complex… but you also have finer control over the scope 
(it can cover only part of a large type or two friend types).

Thanks,
Jon
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to