<div dir="ltr">On Fri, Mar 24, 2017 at 9:55 PM, Drew Crawford <span dir="ltr">&lt;<a href="mailto:drew@sealedabstract.com" target="_blank">drew@sealedabstract.com</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><span class="gmail-"><div id="gmail-m_2794103182658027565bloop_customfont" style="font-family:helvetica,arial;font-size:13px;color:rgb(0,0,0);margin:0px"><br></div> <br> <div id="gmail-m_2794103182658027565bloop_sign_1490410237128793856" class="gmail-m_2794103182658027565bloop_sign"></div> <br><p class="gmail-m_2794103182658027565airmail_on">On March 24, 2017 at 9:50:01 PM, Xiaodi Wu (<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>) wrote:</p> <div><blockquote type="cite" class="gmail-m_2794103182658027565clean_bq" style="font-family:helvetica,arial;font-size:13px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span><div><span style="color:rgb(0,0,0);font-family:&#39;helvetica neue&#39;,helvetica;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);float:none;display:inline">Figuring out what&#39;s statically vs. dynamically dispatched can be very difficult with Swift. Although each rule is defensible when dissected individually, the overall scheme once `final`, `dynamic`, `@objc`, etc. are included is supremely inelegant. Far from being an example of a core value, I would say it&#39;s an example of a major weakness. I see one of the key goals of the Swift evolution process as reducing and, where possible, eliminating such designs from the language.</span></div></span></blockquote></div></span><p>How would you respond to clattner&#39;s <a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/001948.html" target="_blank">position piece</a> on this?  It seems to contradict you on exactly this point, e.g.</p><blockquote type="cite" style="border-width:1px;padding-left:5px;border-left-color:rgb(0,64,128)">Swift is another case of a hybrid model: its semantics provide predictability between obviously static (structs, enums, and global funcs) and obviously dynamic (classes, protocols, and closures) constructs.  A focus of Swift (like Java and Javascript) is to provide an apparently simple programming model.  However, Swift also intentionally &quot;cheats&quot; in its global design by mixing in a few tricks to make the dynamic parts of the language optimizable by a static compiler in many common cases...</blockquote><blockquote type="cite" style="border-width:1px;padding-left:5px;border-left-color:rgb(0,64,128)">The upshot of this is that Swift isn’t squarely in either of the static or dynamic camps: it aims to provide a very predictable performance model (someone writing a bootloader or firmware can stick to using Swift structs and have a simple guarantee of no dynamic overhead or runtime dependence) while also providing an expressive and clean high level programming model - simplifying learning and the common case where programmers don’t care to count cycles.</blockquote></div></blockquote><div><br></div><div>I agree absolutely with those aims: very predictable performance, expressive and clean model, simplified learning and common cases. I&#39;m arguing that the giant table of dispatch rules (see: <a href="http://raizlabscom-wpengine.netdna-ssl.com/dev/wp-content/uploads/sites/10/2016/12/Summary-3.png">http://raizlabscom-wpengine.netdna-ssl.com/dev/wp-content/uploads/sites/10/2016/12/Summary-3.png</a>) does not reach that goal. At least half a dozen independent threads have been started on this list alone about why methods in protocol extensions can only be shadowed but not overridden. The goal of evolution, IMO, is precisely to refine the &quot;apparent model&quot; as much as possible, eliminating as many of these exposed jagged edges wherever it is reasonable to have the compiler make it &quot;just work.&quot;</div><div><br></div><div>The same argument goes here for `fileprivate` and new `private`. I don&#39;t see anyone who thinks that the current set of access modifiers is &quot;clean&quot;; and no one has argued that the expanded set of access modifiers &quot;simplified learning and common cases.&quot; Moreover, it enables no performance wins. In fact, it does the *opposite* of what Chris is praising in his email. There, he says that Swift &quot;provide[s] an apparently simple programming model&quot; for dispatch but &quot;cheats&quot; under the covers to recover additional performance wins; here, access modifiers in Swift 3 deliberately expose a more complex model than before, but does not gain for the compiler any additional optimization opportunities from doing so.</div></div><br></div></div>