<div dir="ltr"><div>In order to evaluate this proposal, I created a table of as many relevant scenarios as I could think of, and listed how each of the proposed solutions would work there. The four access level systems I compared are:</div><div><br></div><div><b>No change:</b> The existing Swift 3 <i>status quo</i> with “fileprivate” and “private”.</div><div><br></div><div><b>SE–0159:</b> Revert to the Swift 2 meaning of “private” (file visibility) and eliminate scoped access altogether.</div><div><br></div><div><b>SE–0169:</b> Expand “private” to include the current type and all its extensions in the same file.</div><div><br></div><div><b>Rename:</b> Change the spelling of “private” to “scoped”, and “fileprivate” to “private”.</div><div><br></div><div>I ended up with a list of eight scenarios to evaluate. These are:</div><div><br></div><div>1. “Simple file”, a single type with no extensions.</div><div>2. “Extensions”, a single type and extensions thereof.</div><div>3. “Sharing”, multiple types that need privileged access to each other.</div><div>4. “Helper visible”, the interface of a helper (or nested) type for use within the file.</div><div>5. “Helper hidden”, the details of a helper type that should not be visible to other types.</div><div>6. “Invariants”, the details of a type that should only be touched by dedicated methods.</div><div>7. “Multi-type”, multiple types that should not have privileged access to each other.</div><div>8. “Multi-type + ext”, multiple types that should not have privileged access to each other, and extensions thereof.</div><div><br></div><div>The entries in the table have seven possible values:</div><div><br></div><div><b>private:</b> The “private” keyword works.</div><div><br></div><div><b>fileprivate:</b> The “fileprivate” keyword works.</div><div><br></div><div><b>scoped:</b> The “scoped” keyword works.<br></div><div><b><br></b></div><div><b>private x2:</b> The “private” keyword works if the types are put into separate files.<br></div><div><br></div><div><b>fileprivate x2:</b> The “fileprivate” keyword works if the types are put into separate files.</div><div><br></div><div><b>helper type:</b> The goal can only be achieved by creating a helper type.</div><div><br></div><div><b>no hiding:</b> The specified items cannot be hidden from the rest of the file.<br><br>Here is the completed and color-coded table (I hope it displays properly in this email):</div><div><br></div><div><br><table cellspacing="0" cellpadding="0" style="border-collapse:collapse">
<tbody>
<tr>
<td valign="top" style="width:135px;height:20px;background-color:rgb(190,192,191);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px;font-variant-numeric:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:helvetica;min-height:14px"><br></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(190,192,191);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>No change</b></font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(190,192,191);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>SE–0159</b></font></p>
</td>
<td valign="top" style="width:107px;height:20px;background-color:rgb(190,192,191);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>SE–0169</b></font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(190,192,191);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>Rename</b></font></p>
</td>
</tr>
<tr>
<td valign="top" style="width:135px;height:20px;background-color:rgb(220,220,220);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>Simple file</b></font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:107px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
</tr>
<tr>
<td valign="top" style="width:135px;height:19px;background-color:rgb(220,220,220);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>Extensions</b></font></p>
</td>
<td valign="top" style="width:106px;height:19px;background-color:rgb(255,222,3);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">fileprivate</font></p>
</td>
<td valign="top" style="width:106px;height:19px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:107px;height:19px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:106px;height:19px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
</tr>
<tr>
<td valign="top" style="width:135px;height:20px;background-color:rgb(220,220,220);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>Sharing</b></font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(255,222,3);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">fileprivate</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:107px;height:20px;background-color:rgb(255,222,3);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">fileprivate</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
</tr>
<tr>
<td valign="top" style="width:135px;height:20px;background-color:rgb(220,220,220);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>Helper visible</b></font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(255,222,3);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">fileprivate</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:107px;height:20px;background-color:rgb(255,222,3);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">fileprivate</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
</tr>
<tr>
<td valign="top" style="width:135px;height:20px;background-color:rgb(220,220,220);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>Helper hidden</b></font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(255,60,0);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">no hiding</font></p>
</td>
<td valign="top" style="width:107px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(93,224,230);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">scoped</font></p>
</td>
</tr>
<tr>
<td valign="top" style="width:135px;height:20px;background-color:rgb(220,220,220);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>Invariants</b></font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(255,60,0);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">no hiding</font></p>
</td>
<td valign="top" style="width:107px;height:20px;background-color:rgb(255,95,227);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">helper type</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(93,224,230);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">scoped</font></p>
</td>
</tr>
<tr>
<td valign="top" style="width:135px;height:19px;background-color:rgb(220,220,220);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>Multi-type</b></font></p>
</td>
<td valign="top" style="width:106px;height:19px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:106px;height:19px;background-color:rgb(160,238,118);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private x2</font></p>
</td>
<td valign="top" style="width:107px;height:19px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:106px;height:19px;background-color:rgb(93,224,230);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">scoped</font></p>
</td>
</tr>
<tr>
<td valign="top" style="width:135px;height:20px;background-color:rgb(220,220,220);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p style="margin:0px"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)"><b>Multi-type + ext</b></font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(255,147,0);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">fileprivate x2</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(160,238,118);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private x2</font></p>
</td>
<td valign="top" style="width:107px;height:20px;background-color:rgb(34,184,24);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private</font></p>
</td>
<td valign="top" style="width:106px;height:20px;background-color:rgb(160,238,118);border-style:solid;border-width:1px;border-color:rgb(0,0,0);padding:4px">
<p align="center" style="margin:0px;text-align:center"><font face="Source Sans Pro" color="#000000" style="font-variant-numeric:normal;font-stretch:normal;font-size:16px;line-height:normal;font-family:&quot;source sans pro&quot;;font-kerning:none;font-variant-ligatures:common-ligatures;color:rgb(0,0,0)">private x2</font></p>
</td>
</tr>
</tbody>
</table></div><div><br></div><div><br></div><div><b>Analysis</b></div><div><br></div><div>Some people have said on-list that they view cross-type sharing as an anti-pattern. If that is true, then we can simply ignore the “Sharing” row because it would not be worth optimizing for. This hardly changes the table though, as that row is identical to the “Helper visible” row below it.</div><div><br></div><div>Regarding the “Invariants” row, note that a helper type can be used for this purpose under “No change” and “Rename” just as well as under “SE–0169”. The difference is that SE-0169 provides no other way to hide invariants from the rest of the type, whereas the other two have an access level suited to the purpose. Similarly, the multi-type rows can be satisfied by separate files regardless of which access system is in place.</div><div><br></div><div>If a person takes the view that things in the same file should naturally have access to one another, then the bottom four rows of the table can be ignored. Such a person might have the mantra, “Only put things together if they belong together”, and they would ask, “What else is in the file that you are trying to hide from?”</div><div><br></div><div>For someone whose primary use-case is to put one type in a file and build it up through extensions, the “Extension” row is of greatest concern. To them, any of SE–0159, SE–0169, or renaming would let them use “private” instead of “fileprivate” everywhere.</div><div><br></div><div>As a final remark, each of the four options has one notable benefit and one notable drawback, not all of which are apparent from the above table:</div><div><div><br></div><div><div><b>No change</b></div><div>Benefit: No change to the language.</div><div>Drawback: Must use “fileprivate” to build up a type through extensions.</div><div><br></div><div><b>SE–0159</b></div><div>Benefit: Simplifies the access control model.</div><div>Drawback: Cannot protect invariants within a file.</div><div><br></div><div><b>SE–0169</b></div><div>Benefit: Cross-type sharing is clearly marked.</div><div>Drawback: Must use a helper type to protect invariants within a file.</div><div><br></div><div><b>Rename</b></div><div>Benefit: No change to semantics.</div><div>Drawback: Two separate keywords are changed.</div></div></div><div><br></div><div> • • •</div><div><br></div><div>And now, having said all that, I need to go take a nap!<br></div><div><br></div><div>Once everything has percolated, I’ll come back to write a review of the current proposal.</div><div><br></div><div>Nevin</div></div>