<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Oct 16, 2016, at 3:28 PM, T.J. Usiyan &lt;<a href="mailto:griotspeak@gmail.com" class="">griotspeak@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">I don't like this at all and it comes down to &nbsp;"<span style="font-size:12.800000190734863px" class="">what is hidden can also be unhidden</span>". This, to me, feels like it would create more confusion than it would address. </div></div></blockquote><div>I don’t think it would cause confusion. Other languages have things like protected, which is currently a glaring hole in Swift’s access control. This addresses that without any of the complexity of friend classes, etc….</div><div><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class="">Why not just use `internal` for `hidden` items?&nbsp; </div></div></blockquote><div>Because there is an important aspect of communicating the author’s intent.&nbsp;</div><div><br class=""></div><div>I think it is important to be able to mark things which are not meant to be public (and internal is essentially public in the main module), but may be required by extensions/subclasses. With internal, it would be easy to accidentally create tightly coupled structures. &nbsp;With ‘hidden', it requires intentional annotation (via the ‘include hidden’ statement) to gain access, so more thought will be given to the coupling.</div><div><br class=""></div><div>Also, internal would prevent extensions/subclasses outside the defining module. &nbsp;With ‘hidden’ you have an author approved way of extending a type (even from another module). &nbsp;I can’t actually think of a single use of ‘fileprivate’ where my intent/need was something other than allowing extensions. Unfortunately, with the current model those files can get quite a bit bigger than is ideal from an organizational standpoint.</div><div><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class="">If we're ok with modifying import statements, why not simply have a command that imports `fileprivate` stuff? (not advocating for this).</div></div></blockquote><div>From a technical perspective, that is essentially what I am proposing, but terminology matters. &nbsp;The word fileprivate was chosen to convey that the associated item was private to scope of the file. With this, we need to convey a slightly different intent because, while it does open access at file granularity, it is no longer private to the scope of that single file, and the name would be misleading.</div><div><br class=""></div><div>It doesn’t need to be the word ‘hidden’ necessarily, but it should be something with the correct connotation for the new behavior.</div><div><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="">I think that submodules would have really helped with this issue and it is unfortunate that we couldn't get them in for swift 3.&nbsp;</div></div></div></blockquote><div>I also want submodules, but they won’t fully solve the protected problem above. &nbsp;They would allow you to group KNOWN subclasses and extensions into a single submodule. &nbsp;But they would also prevent further extensions and subclasses from being made by the consumer of that module. &nbsp;If that is what you want, then submodules are the answer, but there are also lots of cases where an author wants to allow careful subclassing outside of the original module. &nbsp;</div><div><br class=""></div><div>A good example of this is UIGestureRecognizer, which separates its protected items into a different include. &nbsp;It hides all of the dangerous properties/methods in that separate file, and 98% of the time you don’t need it. &nbsp;However, if you want to create your own gesture recognizer, you can’t really do it without those dangerous methods… thus you include the file. &nbsp;With the submodule approach, you would either be unable to create your own gesture recognizer subclasses or the dangerous methods would be made available inappropriately.</div><div><br class=""></div><div><br class=""></div><div>Thanks,</div><div>Jon</div><div><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div class="gmail_extra"><div class="gmail_quote">On Sun, Oct 16, 2016 at 4:34 PM, Jonathan Hull via swift-evolution <span dir="ltr" class="">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt;</span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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).&nbsp; I was thinking about how to mesh those two ideas, and I think I may have come up with a solution.<br class="">
<br class="">
I propose we replace ‘fileprivate’ with a new ‘hidden’ access level.&nbsp; Hidden would work exactly the same way as fileprivate does now, but adds the connotation that what is hidden can also be unhidden.&nbsp; 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).<br class="">
<br class="">
#FileA<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; import Foundation<br class="">
<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; Struct A {<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private var x:Int<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hidden var y:Int&nbsp; //This is just like fileprivate, but can also be shared with other files<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; }<br class="">
<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; extension A {<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //y can be accessed here because they are in the same file<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; }<br class="">
<br class="">
<br class="">
#FileB<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; import Foundation<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; import hidden A&nbsp; //This allows the entire file to see A’s hidden variables<br class="">
<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; extension A {<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //y can be accessed here because of the ‘import hidden’ declaration<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; }<br class="">
<br class="">
<br class="">
#FileC<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; import Foundation<br class="">
<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; extension A {<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //y can NOT be seen or accessed here because it is hidden<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; }<br class="">
<br class="">
<br class="">
I think this is a fairly elegant solution to our protected dilemma, which also feels in sync with Swift 2’s file-based scheme.&nbsp; The key features:<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; • Extensions no longer need to be piled in the same file if it is getting too long<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; • Subclasses can be in their own file, but still have access to the necessary parts of their superclass<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; • 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 extension/subclassing<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; • It requires an explicit statement ‘import hidden’ to access the hidden variables. Safe by default, with override.<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; • It is not bound by module boundaries&nbsp; (i.e. you could use it for subclassing classes from an imported module)<br class="">
&nbsp; &nbsp; &nbsp; &nbsp; • Roughly the same length as ‘private’ and ‘public’ so various declarations packed together are much easier to read (fileprivate breaks reading rhythm)<br class="">
<br class="">
Worth a formal proposal?<br class="">
<br class="">
Thanks,<br class="">
Jon<br class="">
<br class="">
<br class="">
<br class="">
______________________________<wbr class="">_________________<br class="">
swift-evolution mailing list<br class="">
<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank" class="">https://lists.swift.org/<wbr class="">mailman/listinfo/swift-<wbr class="">evolution</a><br class="">
</blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></body></html>