<div dir="ltr">private means something different in OOP. Providing scoped access level and calling it something other than private is good for backward compatibility, but is not good for many people coming from other languages and who are used to the OOP terminology (they would expect &quot;scoped&quot; to be &quot;private&quot;.)<div><br></div><div>protected also means something different in OOP.</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Mar 31, 2016 at 9:54 PM Wallacy via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I have to say, I&#39;m not very happy with the progress of this topic ..<div>Let me explain:<br></div><div>I&#39;m Swift user from day 1. A few weeks after, even with the limitations of language, had an application in production.<br></div><div><br></div><div><div>One of the &quot;cool&quot; features that regularly use in my application is the &quot;file private&quot; access level. Is very better (in practice) than C++ friendly, and enable a lot of different manners to think in our code design.</div><div><br></div><div>For example: I have a &quot;hand shake&quot; file, wen two specific types extension knows about specift (and private) functions to do this &quot;hand shake&quot;. </div></div><div><br></div><div><div>So, my problem is, after almost two years using Swift, &quot;public&quot;, &quot;internal&quot; and &quot;private&quot; is just &quot;so obvious&quot; and very easy to understand, change the &quot;old&quot; private to something else is not very good.</div></div><div><br></div><div><div>I can understand the need to &quot;more private&quot; than current private, but who need this feature?</div><div>* devs which do not want declare this &quot;important&quot; type in a different file.</div><div>* devs which want to declare more than one type per file to make some &quot;<u>friendly</u>&quot; relationship, but not share some other specific information.</div></div><div>* devs which want to declare more than one type per file and <u>not</u> make any relationship with these types different than public.</div><div><br></div><div>Also, I&#39;m not expert, but the actual swift access control appear to enable some good compiler optimizations, and works very well with top level objects.<br></div><div><br></div><div>So my proposal is:<br><div class="gmail_quote"><div dir="ltr"><br></div><div>- <b>public</b> (do not change)</div><div>- <b>internal</b> (do not change)</div><div>- <b>private</b> (do not change)</div><div>- <b>protect</b> (new)</div><div><br></div><div>Why protect?</div><div><br></div><div><b>First</b>, I believe that is a good word to identify a property that will be accessed in a specific scope.<br></div><div><b>Second</b>, it will only be used when the person declaring more than one type in a single file and does not want to share any specific property. I think this person opt to share the same file for more than one type, the &quot;scope&quot; access control will be less used than current private (file based) because a think there less &quot;super private&quot; properties between between those types for the rest of the module.</div><div><b>Third</b>, although I believe that Swift not need (and will not get) access control only to subtypes, simply update this &quot;protect&quot; is enough (task for another proposal). And even if the protect switch to &quot;also&quot; share properties between subtypes, only those who want to put all subtypes in the same file will lose.<br></div><div><br></div><div>Is impossible to make everyone happy anyway... And i think is good choose the path which &quot;extends&quot; the rationale of the Swift access control over these two years instead say &quot;file based access control is now not so important&quot;.<br></div></div></div></div><div dir="ltr"><div><div class="gmail_quote"><div><br></div><div><br></div><div dir="ltr"><br></div><div dir="ltr">Em qui, 31 de mar de 2016 às 01:22, Chris Lattner via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; escreveu:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Mar 23, 2016, at 10:13 PM, Chris Lattner &lt;<a href="mailto:clattner@apple.com" target="_blank">clattner@apple.com</a>&gt; wrote:<br>
&gt; How about we continue this trend, and follow other existing Swift keywords that merge two lowercase words (associatedtype, typealias, etc), and use:<br>
&gt;<br>
&gt;       public<br>
&gt;       moduleprivate<br>
&gt;       fileprivate<br>
&gt;       private<br>
&gt;<br>
&gt; The advantages, as I see them are:<br>
&gt; 1) We keep public and private meaning the “right” and “obvious” things.<br>
&gt; 2) The declmodifiers “read” correctly.<br>
&gt; 3) The unusual ones (moduleprivate and fileprivate) don’t use the awkward parenthesized keyword approach.<br>
&gt; 4) The unusual ones would be “googable”.<br>
&gt; 5) Support for named submodules could be “dropped in” by putting the submodule name/path in parens: private(foo.bar.baz) or moduleprivate(foo.bar).  Putting an identifier in the parens is much more natural than putting keywords in parens.<br>
<br>
I’ve seen a number of concerns on this list about moduleprivate, and how it penalizes folks who want to explicitly write their access control.  I’ve come to think that there is yes-another possible path forward here (which I haven’t seen mentioned so far):<br>
<br>
public<br>
internal<br>
fileprivate<br>
private<br>
<br>
The advantages, as I see them are:<br>
1) We keep public and private meaning the “right” and “obvious” things.<br>
2) The declmodifiers “read” correctly.<br>
3) Compared to Swift 2, there is almost no change.  The only thing that changes is that some uses of Swift 2 “private” will be migrated to “fileprivate”, which makes the intent of the code much more clear.<br>
4) fileprivate is the unusual and not-really-precedented-in-other-languages modifier, and it would still be “googable”.<br>
5) The addresses the “excessively long” declmodifier problem that several people are concerned with.<br>
6) Support for named submodules could be “dropped in” by parameterizing “internal”.<br>
<br>
Thoughts?<br>
<br>
-Chris<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div></div></div>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div>