<div dir="ltr">I&#39;m considering this from a different angle.<div><br></div><div>When we declare a type, we declare properties and functions which that type has.</div><div>When we extend a type, we add functions to the type. (I&#39;m including computed properties in this.)</div><div>It&#39;s become an idiom of Swift to declare an extension to a type for each protocol we want it to conform to, for reasons of code organisation and readability. This may be true even if conformance to the protocol was a primary intent of creating the type in the first place.</div><div><br><div>The intent of the scoped access level is to allow programmers to create properties and functions which are limited to the scope of their declaration. A protocol conformance can be written, with the aid of helper functions, in the confidence that the helper functions are not visible outside the extension, minimising their impact on other components of the module.</div><div>However, some protocol conformances require the type to have a specific property, which the extension cannot facilitate. Some protocol conformances don&#39;t require a property, but it would be really useful to have one, and again an extension can&#39;t facilitate.</div><div><br></div><div>Example: we want to be able to write this, but we can&#39;t:</div><div><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures">private</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> </span><span style="font-variant-ligatures:no-common-ligatures">protocol</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> Bar</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">{</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">  </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">var</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> integer : </span><span style="color:rgb(112,61,170);font-variant-ligatures:no-common-ligatures">Int</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> { </span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">get</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> }</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">  </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">func</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> increment()</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">}</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures">struct</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> Foo</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">{</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">}</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures">extension</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">Foo</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> : </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">Bar</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">{</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">  </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">var</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> integer : </span><span style="color:rgb(112,61,170);font-variant-ligatures:no-common-ligatures">Int</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">  </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">private</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> </span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">var</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> counter : </span><span style="color:rgb(112,61,170);font-variant-ligatures:no-common-ligatures">Int</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">  </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">func</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> increment()</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span style="white-space:pre">  </span>{</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span style="white-space:pre">    </span>counter += </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(39,42,216)">1</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span style="white-space:pre">  </span>}</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)">








</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">}</span></p></div><div><br></div><div>This leads to a workaround: that properties are added to the original type, and declared as fileprivate. They&#39;re not intended to be visible to any scope other than the conforming extension - not even, really, to the type&#39;s original scope.</div><div><br></div><div>Continuing the example: we&#39;ve compromised and written this:</div><div><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures">private</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> </span><span style="font-variant-ligatures:no-common-ligatures">protocol</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> Bar</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">{</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">  </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">var</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> integer : </span><span style="color:rgb(112,61,170);font-variant-ligatures:no-common-ligatures">Int</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> { </span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">get</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> }</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">  </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">func</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> increment()</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">}</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures">struct</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> Foo</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">{</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures"><font color="#000000"><span style="white-space:pre">  </span></font><font color="#ba2da2">fileprivate</font></span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> </span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">var</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> integer : </span><span style="color:rgb(112,61,170);font-variant-ligatures:no-common-ligatures">Int</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures"><font color="#000000"><span style="white-space:pre">  </span></font><font color="#ba2da2">fileprivate</font></span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> </span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">var</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> counter : </span><span style="color:rgb(112,61,170);font-variant-ligatures:no-common-ligatures">Int</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">}</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures">extension</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">Foo</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> : </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">Bar</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">{</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">  </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">func</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> increment()</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span style="white-space:pre">  </span>{</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span style="white-space:pre">    </span>counter += </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(39,42,216)">1</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span style="white-space:pre">  </span>}</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="color:rgb(0,0,0)">}</span><br></p></div><div><br></div><div>This is not a fault of <span style="color:rgb(186,45,162);font-family:menlo;font-size:11px">fileprivate</span> (though it&#39;s a clunky name), or <span style="color:rgb(186,45,162);font-family:menlo;font-size:11px">private</span>. Renaming these levels does not solve the problem. Removing private, such that everything becomes fileprivate, does not solve the problem. The problem is in the extension system.</div><div>(At this point I realise I&#39;m focusing on one problem as if it&#39;s the only one.)</div><div><br></div><div>Supposing we approached extensions differently. I think around SE-0025 we were considering a &#39;nested&#39; access level.</div><div><br></div><div>Supposing we created a &#39;conformance region&#39; inside a type declaration - a scope nested within the type declaration scope - and that this conformance region had its own access level. It&#39;s inside the type declaration, not separate from it like an extension, so we can declare properties inside it. But literally the only properties and functions declared inside the region but visible anywhere outside of it, would be properties and functions declared in the named protocol being conformed to.</div><div><br></div><div>So, visually it might look like this:</div><div><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures"><br></span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures">private</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> </span><span style="font-variant-ligatures:no-common-ligatures">protocol</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> Bar</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">{</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">  </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">var</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> integer : </span><span style="color:rgb(112,61,170);font-variant-ligatures:no-common-ligatures">Int</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> { </span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">get</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> }</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">  </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">func</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> increment()</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">}</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures">struct</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> Foo</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">{</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,132,0)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"><span style="white-space:pre">  </span></span><span style="color:rgb(186,45,162)">conformance</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> Bar </span><span style="font-variant-ligatures:no-common-ligatures">// or conformance Foo : Bar, but since the region is inside Foo that&#39;s redundant</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span style="white-space:pre">  </span>{</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">    </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">var</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> integer : Int </span><span style="color:rgb(0,132,0);font-variant-ligatures:no-common-ligatures">// visible because Foo : Bar, at Bar&#39;s access level</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">    </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">var</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> counter : Int = </span><span style="color:rgb(39,42,216);font-variant-ligatures:no-common-ligatures">0</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> </span><span style="color:rgb(0,132,0);font-variant-ligatures:no-common-ligatures">// only visible inside the conformance scope, because not declared in Bar</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures;white-space:pre"><font color="#000000">    </font></span><span style="color:rgb(186,45,162);font-variant-ligatures:no-common-ligatures">func</span><span style="color:rgb(0,0,0);font-variant-ligatures:no-common-ligatures"> increment() </span><span style="color:rgb(0,132,0);font-variant-ligatures:no-common-ligatures">// visible because Foo : Bar, at Bar&#39;s access level</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span style="white-space:pre">    </span>{</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span style="white-space:pre">      </span>counter += </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(39,42,216)">1</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span style="white-space:pre">    </span>}</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span style="white-space:pre">  </span>}</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">}</span></p></div><div><span style="font-variant-ligatures:no-common-ligatures"><br></span></div><div>I&#39;ve introduced a new keyword, <span style="color:rgb(186,45,162);font-family:menlo;font-size:11px">conformance</span>, though it may be clear enough to keep using <span style="color:rgb(186,45,162);font-family:menlo;font-size:11px">extension</span> inside a scope for this. Foo still conforms to Bar, in the same file. We&#39;ve removed &#39;extension Foo :&#39; and moved a &#39;}&#39; for this, but that&#39;s not a breaking change as this is an addition. Readability is compromised to the extent that this conformance is indented one level.</div><div><br></div><div>I&#39;ve not long had the idea. It&#39;s a different approach and may be worth a discussion thread of its own for - or someone might point out some glaringly obvious flaw in it. If it&#39;s useful, I don&#39;t know the full implications this would have, such as how much this would reduce the use of <span style="color:rgb(186,45,162);font-family:menlo;font-size:11px">fileprivate</span> (e.g. to none, to the minimal levels expected in SE-0025, or no effect at all). It&#39;s just intended to remove a problem which <span style="color:rgb(186,45,162);font-family:menlo;font-size:11px">fileprivate</span> is applied as a bad workaround for.</div><div><br></div><div>Ross</div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 27, 2017 at 4:26 PM, Rien via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
&gt; On 27 Mar 2017, at 16:46, Steven Knodl via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; Late to the party here<br>
&gt;<br>
&gt; * What is your evaluation of the proposal?<br>
&gt; I’m -1 on this.  The proposal is not a difficult read, but may have been simply more simply named “Remove Scoped Access Level/Revert SE-0025” as that is what is being proposed. “Fix” seems to me to be a unfortunately worded judgmental proposal title.<br>
&gt;<br>
&gt; * Is the problem being addressed significant enough to warrant a change?<br>
&gt; No.  I consider myself to be a fairly “new/n00b” Obj-C/Swift developer. Although SE-0025 was a change that required source changes when implemented, the reasoning was not difficult to understand and changes were simple to make once identified.   Here they are from SE-0025<br>
&gt;<br>
&gt;       • public: symbol visible outside the current module<br>
&gt;       • internal: symbol visible within the current module<br>
&gt;       • fileprivate: symbol visible within the current file<br>
&gt;       • private: symbol visible within the current declaration<br>
&gt;<br>
&gt; Moving forward these changes are not difficult to comprehend.  I tend to make _everything_ “private” up front so I don’t have any API leakage.  Then dial back to “fileprivate” as needed.  It’s not difficult for me I guess.<br>
<br>
</span>Right. I do that myself more than I would like to admit.<br>
But when we only loosen up/tighten down during coding then access levels are almost useless.<br>
The point of access level control is in the design, not in the coding.<br>
If we made a design (including access levels) and then have to dial back, that should be a warning that something is wrong.<br>
To me, this is an argument in favour of the proposal.<br>
<br>
Rien.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
&gt;   As such, I don’t believe that this change was “Actively Harmful”,  especially for new developers who have a clean slate or simply are leaving everything unmarked (internal) anyhow until they move up to more advanced topics.  Unraveling a generic or functional code someone else wrote uses way more cognitive power.<br>
&gt;<br>
&gt; I’d like to address the suggestion that the migration for SE-0159 could “simply” be a search and replace without loss of functionality.  This doesn’t make sense if you consider the entire code lifecycle.  Sure the code gets migrated and compiles.  This is fine if they code _never_ has to be read again.  But as we know, code is written once and _read many times_ as it will need to be maintained.  The distinction between private and fileprivate contains information, and although it may work correctly now, some information meant to help maintain that code has been lost if these keywords are merged and the functionality of scoped access is removed.  So yes if you don’t maintain the code where this migration takes place, this would be ok. But Swift strives for readability.  Moving classes to separate files to address these issues, creates a multitude of Bunny classes where again for readability some classes belong together in the same file for ease of comprehension (again, code is written once , read many times)<br>
&gt;<br>
&gt; * Does this proposal fit well with the feel and direction of Swift?<br>
&gt; The spirit of the proposal to simplify access levels is well taken.  This proposal however simplifies at the expense of lost functionality (Scoped Access levels) with no replacement.  The threads talk a about submodules and other solutions that could fill this gap that are not on the roadmap, planned or possible which makes them  non-admissible in considering this proposal.<br>
&gt;<br>
&gt; * If you have used other languages, libraries, or package managers with a similar feature, how do you feel that this proposal compares to those?<br>
&gt; I am more familiar with scoped access so perhaps that feels more natural to me.  But with the current implementation Swift users can choose whether they use File Based or Scope Based tools, so although not ideal to either side, acceptable until a suitable replacement could be forged.<br>
&gt;<br>
&gt; * How much effort did you put into your review? A glance, a quick reading, or an in-depth study?<br>
&gt; Re-read SE-0025/proposal/most of this very long thread<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; From: &lt;<a href="mailto:swift-evolution-bounces@swift.org">swift-evolution-bounces@<wbr>swift.org</a>&gt; on behalf of Tino Heth via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;<br>
&gt; Reply-To: Tino Heth &lt;<a href="mailto:2th@gmx.de">2th@gmx.de</a>&gt;<br>
&gt; Date: Monday, March 27, 2017 at 6:48 AM<br>
&gt; To: Zach Waldowski &lt;<a href="mailto:zach@waldowski.me">zach@waldowski.me</a>&gt;<br>
&gt; Cc: &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;<br>
&gt; Subject: Re: [swift-evolution] [Review] SE-0159: Fix Private Access Levels<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;&gt; I am now absolutely thrilled to create a filter to Mark As Read anything else arising from this thread. Good luck.<br>
&gt;<br>
&gt; That might be a good idea — after more than 200 messages, and a quite circular discussion with an unhealthy amount of ignorance for the opposing side ;-).<br>
&gt;<br>
&gt; To fight the latter, I just tried to take the position that &quot;new private&quot; is really important, and this imho leads to interesting consequences...<br>
&gt; This access modifier really doesn&#39;t solve a problem, like &quot;let&quot; does (unless the problem you want to solve is having a language with private access).<br>
&gt; Have a look at this:<br>
&gt;<br>
&gt; public struct SeperateConcerns {<br>
&gt;        private var foo: Int = 0<br>
&gt;        public mutating func updateFoo(_ value: Int) {<br>
&gt;               print(&quot;The only allowed way to change foo was invoked&quot;)<br>
&gt;               foo = value<br>
&gt;        }<br>
&gt;<br>
&gt;        private var bar: Int = 0<br>
&gt;        public mutating func updateBar(_ value: Int) {<br>
&gt;               print(&quot;The only allowed way to change bar was invoked&quot;)<br>
&gt;               bar = value<br>
&gt;        }<br>
&gt;<br>
&gt;        private var foobar: Int = 0<br>
&gt;        public mutating func updateFoobar(_ value: Int) {<br>
&gt;               print(&quot;The only allowed way to change foobar was invoked&quot;)<br>
&gt;               foobar = value<br>
&gt;        }<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; You can protect foo from being changed by code in other files, and from extensions in the same file — and if the latter is a concern, there should also be a way to limit access to foo to specific function in scope.<br>
&gt; Afaik, somebody proposed &quot;partial&quot; type declarations, but without them, the meaning of private is rather arbitrary, and the feature is only useful for a tiny special case.<br>
&gt; If we had partial types, the situation would be different, and if would be possible to declare extensions inside a partial declaration of another type, we could even remove fileprivate without an replacement (I guess I should write a separate mail for this thought…)<br>
&gt; ______________________________<wbr>_________________ swift-evolution mailing list <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a> <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
&gt; ______________________________<wbr>_________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br>
______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
</div></div></blockquote></div><br></div>