<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=""><div><blockquote type="cite" class=""><div class="">On Apr 15, 2017, at 2:01 AM, Manolo van Ee via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class=""><div class="gmail_quote"><div class=""><span style="color: rgb(69, 69, 69); font-family: 'Helvetica Neue';" class="">Hi All,</span></div><div style="word-wrap:break-word" class=""><div class=""><div style="margin:0px;line-height:normal;font-family:'Helvetica Neue';color:rgb(69,69,69);min-height:14px" class=""><br class=""></div><div style="margin:0px;line-height:normal;font-family:'Helvetica Neue';color:rgb(69,69,69)" class="">I’ve been following the access control discussion a little and I had an idea that I wanted to throw out here. I know it’s too late and the idea doesn’t provide source compatibility, but it seemed worthwhile to post it anyway. My apologies if something similar has already been proposed.</div><div style="margin:0px;line-height:normal;font-family:'Helvetica Neue';color:rgb(69,69,69);min-height:14px" class=""><br class=""></div><div style="margin:0px;line-height:normal;font-family:'Helvetica Neue';color:rgb(69,69,69)" class="">First of all, I propose to use a trailing colon ‘:’ to make it clear that it’s an access control keyword. Secondly, the idea introduces new keywords that clearly describe the scope of access:</div><div style="margin:0px;line-height:normal;font-family:'Helvetica Neue';color:rgb(69,69,69);min-height:14px" class=""><br class=""></div><div style="margin:0px;line-height:normal;color:rgb(69,69,69)" class=""><font face="Menlo" style="font-size:11px" class="">scope: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;(formerly private)</font></div><div style="margin:0px;line-height:normal;color:rgb(69,69,69)" class=""><font face="Menlo" style="font-size:11px" class="">file: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(formerly fileprivate)</font></div><div style="margin:0px;line-height:normal;color:rgb(69,69,69)" class=""><font face="Menlo" style="font-size:11px" class="">module: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(formerly internal, default)</font></div><div style="margin:0px;line-height:normal;color:rgb(69,69,69)" class=""><font face="Menlo" style="font-size:11px" class="">extern: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(formerly public)</font></div><div style="margin:0px;line-height:normal;color:rgb(69,69,69)" class=""><font face="Menlo" style="font-size:11px" class="">extern(open): &nbsp; &nbsp;(formerly open)</font></div><div style="margin:0px;line-height:normal;font-family:'Helvetica Neue';color:rgb(69,69,69);min-height:14px" class=""><br class=""></div><div style="margin:0px;line-height:normal;font-family:'Helvetica Neue';color:rgb(69,69,69)" class="">Examples:</div></div><div class=""><ol class="m_6409612839568120956code-lines" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;line-height:1.6em;list-style:none;font-family:Helvetica,Arial,sans-serif"><li style="border-width:0px 0px 0px 18px;border-left-style:solid;border-left-color:transparent;margin:0px;outline:0px;padding:0px 10px 0px 0px;vertical-align:baseline;white-space:pre-wrap;list-style-type:none" class=""><code class="m_6409612839568120956code-voice" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;font-family:Menlo,monospace;word-wrap:break-word;font-size:11px"><span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">extern:</span> <span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">class</span> <span class="m_6409612839568120956vc" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(63,110,116)">SomePublicClass</span> {            <span class="m_6409612839568120956c" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(0,131,18)">// explicitly public class</span></code></li><li style="border-width:0px 0px 0px 18px;border-left-style:solid;border-left-color:transparent;margin:0px;outline:0px;padding:0px 10px 0px 0px;vertical-align:baseline;white-space:pre-wrap;list-style-type:none" class=""><code class="m_6409612839568120956code-voice" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;font-family:Menlo,monospace;word-wrap:break-word;font-size:11px">    <span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">extern:</span> <span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">var</span> <span class="m_6409612839568120956vc" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(63,110,116)">somePublicProperty</span> = <span class="m_6409612839568120956m" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(28,0,207)">0</span>     <span class="m_6409612839568120956c" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(0,131,18)">// explicitly public class member</span></code></li><li style="border-width:0px 0px 0px 18px;border-left-style:solid;border-left-color:transparent;margin:0px;outline:0px;padding:0px 10px 0px 0px;vertical-align:baseline;white-space:pre-wrap;list-style-type:none" class=""><code class="m_6409612839568120956code-voice" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;font-family:Menlo,monospace;word-wrap:break-word;font-size:11px">    <span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">var</span> <span class="m_6409612839568120956vc" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(63,110,116)">someInternalProperty</span> = <span class="m_6409612839568120956m" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(28,0,207)">0</span>           <span class="m_6409612839568120956c" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(0,131,18)">// implicitly internal class member</span></code></li><li style="border-width:0px 0px 0px 18px;border-left-style:solid;border-left-color:transparent;margin:0px;outline:0px;padding:0px 10px 0px 0px;vertical-align:baseline;white-space:pre-wrap;list-style-type:none" class=""><code class="m_6409612839568120956code-voice" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;font-family:Menlo,monospace;word-wrap:break-word;font-size:11px">    <span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">file:</span> <span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">func</span> <span class="m_6409612839568120956vc" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(63,110,116)">someFilePrivateMethod</span>() {}  <span class="m_6409612839568120956c" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(0,131,18)">// explicitly file-private class member</span></code></li><li style="border-width:0px 0px 0px 18px;border-left-style:solid;border-left-color:transparent;margin:0px;outline:0px;padding:0px 10px 0px 0px;vertical-align:baseline;white-space:pre-wrap;list-style-type:none" class=""><code class="m_6409612839568120956code-voice" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;font-family:Menlo,monospace;word-wrap:break-word;font-size:11px">    <span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">scope:</span> <span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">func</span> <span class="m_6409612839568120956vc" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(63,110,116)">somePrivateMethod</span>() {}     <span class="m_6409612839568120956c" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(0,131,18)">// explicitly private class member</span></code></li><li style="border-width:0px 0px 0px 18px;border-left-style:solid;border-left-color:transparent;margin:0px;outline:0px;padding:0px 10px 0px 0px;vertical-align:baseline;white-space:pre-wrap;list-style-type:none" class=""><code class="m_6409612839568120956code-voice" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;font-family:Menlo,monospace;word-wrap:break-word;font-size:11px">}</code></li></ol><div class=""><span style="font-size:11px" class=""><br class=""></span></div></div><div class=""><ol class="m_6409612839568120956code-lines" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;line-height:1.6em;list-style:none;font-family:Helvetica,Arial,sans-serif"><li style="border-width:0px 0px 0px 18px;border-left-style:solid;border-left-color:transparent;margin:0px;outline:0px;padding:0px 10px 0px 0px;vertical-align:baseline;white-space:pre-wrap;list-style-type:none" class=""><code class="m_6409612839568120956code-voice" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;font-family:Menlo,monospace;word-wrap:break-word;font-size:11px"><span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">extern(open):</span> <span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">class</span> <span class="m_6409612839568120956vc" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(63,110,116)">SomeOpenClass</span> {        <span class="m_6409612839568120956c" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(0,131,18)">// explicitly open class</span></code></li><li class=""></li></ol></div><div class=""><ol class="m_6409612839568120956code-lines" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;line-height:1.6em;list-style:none;font-family:Helvetica,Arial,sans-serif"><li style="border-width:0px 0px 0px 18px;border-left-style:solid;border-left-color:transparent;margin:0px;outline:0px;padding:0px 10px 0px 0px;vertical-align:baseline;white-space:pre-wrap;list-style-type:none" class=""><code class="m_6409612839568120956code-voice" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;font-family:Menlo,monospace;word-wrap:break-word;font-size:11px">    <span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">extern(open):</span> <span class="m_6409612839568120956kt" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(170,51,145)">func</span> <span class="m_6409612839568120956vc" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(63,110,116)">someOpenMethod</span>() {} <span class="m_6409612839568120956c" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;color:rgb(0,131,18)">// explicitly open class member</span></code></li><li style="border-width:0px 0px 0px 18px;border-left-style:solid;border-left-color:transparent;margin:0px;outline:0px;padding:0px 10px 0px 0px;vertical-align:baseline;white-space:pre-wrap;list-style-type:none" class=""><code class="m_6409612839568120956code-voice" style="border:0px;margin:0px;outline:0px;padding:0px;vertical-align:baseline;font-family:Menlo,monospace;word-wrap:break-word;font-size:11px">}</code></li></ol><div class=""><br class=""></div></div><div class=""><div style="margin:0px;line-height:normal;font-family:'Helvetica Neue';color:rgb(69,69,69)" class="">Having the keyword describe the access scope actually fits the access control model of Swift very well. The user doesn’t have to learn what public or private means, but only needs to know the concept. Especially coming from another programming language I think public and private are confusing and breaking with it will signal very clearly that the Swift model is different.</div><div style="margin:0px;line-height:normal;font-family:'Helvetica Neue';color:rgb(69,69,69);min-height:14px" class=""><br class=""></div></div><div style="margin:0px;line-height:normal;font-family:'Helvetica Neue';color:rgb(69,69,69);min-height:14px" class=""><div style="margin:0px;line-height:normal" class="">The idea is source breaking, but it’s very easy to deprecate the current syntax with a warning and automatically migrate, because:</div>
<ul class="">
<li style="margin:0px;line-height:normal" class="">All keywords are redefined, so there can be no confusion with the current syntax.</li>
<li style="margin:0px;line-height:normal" class="">Only redefines the syntax, not the semantics.</li></ul><div class=""><br class=""></div><div class="">Funny thing, I thought of this last night and when I woke up this morning I read Erica’s proposal that uses many of the same keywords, although in a different way. Telepathy? Or maybe we’re just onto something here?</div><div class=""><br class=""></div><div class="">I know this will turn everything upside down, but I like the overall consistency, so I just wanted to throw it into the group as the next idea to fix access controls and see if anyone likes it.</div><div class=""><br class=""></div><div class="">Alternatives considered:</div><ul class="">
<li style="margin:0px;line-height:normal" class="">‘all’ instead of ‘extern’. This sounds to me as if it can always be accessed from everywhere, which might not be what we want if we introduce submodules.</li></ul></div></div></div></div></div></blockquote><br class=""></div><div>Approaches like this were evaluated and rejected even before we introduced strict source stability requirements. `extern(open)` undoes an important feature of the `public`/`open` design, which is that there's no syntactic penalty for opening a symbol. And the SE-0169 acceptance specifically stated there would be no more access control changes in Swift 4.</div><div><br class=""></div><div>I don't think this is a viable suggestion.</div><br class=""><div class="">
<span class="Apple-style-span" style="border-collapse: separate; font-variant-ligatures: normal; font-variant-east-asian: normal; font-variant-position: normal; line-height: normal; border-spacing: 0px;"><div class=""><div style="font-size: 12px; " class="">--&nbsp;</div><div style="font-size: 12px; " class="">Brent Royal-Gordon</div><div style="font-size: 12px; " class="">Architechies</div></div></span>

</div>
<br class=""></body></html>