<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=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 2, 2016, at 10:03 AM, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" class="">xiaodi.wu@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div style="white-space:pre-wrap" class="">That proposal was returned for revision; as far as user ergonomics in Swift 3, .self is going to be a consideration. Best to find a solution that reads nicely regardless of the situation with .self removal.<br class=""></div></div></blockquote><div><br class=""></div><div>From the core team decision:</div><div><br class=""></div><div>"The core team would definitely like to circle back to this proposal after Swift 3 is out the door."</div><div><br class=""></div><div>I think we should consider the best long-term design. &nbsp;If that happens to be dropping labels great, but if not, maybe we don’t want to do that just because it will look better in Swift 3 at the cost of a better design when “.self” is not required.</div><div><br class=""></div><div>Dave’s MemoryLayout approach avoids the question of labels entirely. &nbsp;This is another subtle nudge in that direction IMO.</div><br class=""><blockquote type="cite" class=""><div class=""><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Thu, Jun 2, 2016 at 9:57 AM Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com" class="">matthew@anandabits.com</a>&gt; wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class=""><blockquote type="cite" class=""><div class="">On Jun 2, 2016, at 9:43 AM, Erica Sadun &lt;<a href="mailto:erica@ericasadun.com" target="_blank" class="">erica@ericasadun.com</a>&gt; wrote:</div><br class=""><div class=""><div style="word-wrap:break-word" class="">Supporting Dave A, type-based calls are much more likely to be used than instance calls, unlike with dynamicType/type(of:)<div class=""><br class=""></div><div class=""><table style="border-spacing:0px;border-collapse:collapse;margin-top:0px;margin-bottom:16px;display:block;width:888px;overflow:auto;word-break:keep-all;color:rgb(51,51,51);font-family:'Helvetica Neue',Helvetica,'Segoe UI',Arial,freesans,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)" class=""><tbody class=""><tr width="800" style="border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)" class=""><th width="200" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">Term</th><th width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">stdlib search</th><th width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">gist search</th><th width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">Google site:github +swift</th></tr><tr width="800" style="background-color:rgb(248,248,248);border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)" class=""><td width="200" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">sizeof</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">157</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">169</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">4880</td></tr><tr width="800" style="border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)" class=""><td width="200" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">sizeofValue</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">4</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">34</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">584</td></tr><tr width="800" style="background-color:rgb(248,248,248);border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)" class=""><td width="200" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">alignof</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">44</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">11</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">334</td></tr><tr width="800" style="border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)" class=""><td width="200" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">alignofValue</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">5</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">5</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">154</td></tr><tr width="800" style="background-color:rgb(248,248,248);border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)" class=""><td width="200" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">strideof</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">347</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">19</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">347</td></tr><tr width="800" style="border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)" class=""><td width="200" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">strideofValue</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">4</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">5</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)" class="">163</td></tr></tbody></table><div class="">Type-based calls like sizeof() are poor candidates for parameter labels. While it's acceptable to write sizeof(Int), but one must write size(of: Int.self) (with the trailing self) when the function has a label. </div></div></div></div></blockquote><div class=""><br class=""></div></div></div><div style="word-wrap:break-word" class=""><div class=""><div class="">Isn’t this a short-term concern?&nbsp; I thought that requirement was going away.</div></div></div><div style="word-wrap:break-word" class=""><div class=""><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap:break-word" class=""><div class=""><div class="">For this reason, this proposal prefers using no-label calls for types (otherwise they would have been ofType) and labeled calls for values:</div></div><div class=""><br class=""></div><div class=""><pre style="font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;color:rgb(51,51,51)" class=""><span style="color:rgb(0,134,179)" class="">print</span>(<span style="color:rgb(0,134,179)" class="">sizeof</span>(<span style="color:rgb(0,134,179)" class="">Int</span>)) <span style="color:rgb(150,152,150)" class="">// works</span>
<span style="color:rgb(0,134,179)" class="">print</span>(<span style="color:rgb(0,134,179)" class="">sizeof</span>(<span style="color:rgb(0,134,179)" class="">Int</span><span style="color:rgb(167,29,93)" class="">.</span><span style="color:rgb(167,29,93)" class="">self</span>)) <span style="color:rgb(150,152,150)" class="">// works</span>

<span style="color:rgb(167,29,93)" class="">func</span> <span style="color:rgb(121,93,163)" class="">withoutLabel</span>&lt;T&gt;(thetype: T<span style="color:rgb(167,29,93)" class="">.</span><span style="color:rgb(167,29,93)" class="">Type</span>) <span style="color:rgb(167,29,93)" class="">-&gt;</span> <span style="color:rgb(0,134,179)" class="">Int</span> { <span style="color:rgb(167,29,93)" class="">return</span> <span style="color:rgb(0,134,179)" class="">sizeof</span>(T) }
<span style="color:rgb(167,29,93)" class="">func</span> <span style="color:rgb(121,93,163)" class="">withLabel</span>&lt;T&gt;(<span style="color:rgb(121,93,163)" class="">label</span> <span class="">label</span>: T<span style="color:rgb(167,29,93)" class="">.</span><span style="color:rgb(167,29,93)" class="">Type</span>) <span style="color:rgb(167,29,93)" class="">-&gt;</span> <span style="color:rgb(0,134,179)" class="">Int</span> { <span style="color:rgb(167,29,93)" class="">return</span> <span style="color:rgb(0,134,179)" class="">sizeof</span>(T) }


<span style="color:rgb(150,152,150)" class="">// Works</span>
<span style="color:rgb(0,134,179)" class="">print</span>(withoutLabel(<span style="color:rgb(0,134,179)" class="">Int</span>))

<span style="color:rgb(150,152,150)" class="">// Works</span>
<span style="color:rgb(0,134,179)" class="">print</span>(withLabel(label: <span style="color:rgb(0,134,179)" class="">Int</span><span style="color:rgb(167,29,93)" class="">.</span><span style="color:rgb(167,29,93)" class="">self</span>))

<span style="color:rgb(150,152,150)" class="">// Does not work</span>
<span style="color:rgb(150,152,150)" class="">// error: cannot create a single-element tuple with an element label</span>
<span style="color:rgb(150,152,150)" class="">// print(withLabel(label: Int)) </span></pre><div class=""><br class=""></div></div><div class=""><br class=""></div><div class="">So with this in mind:</div><div class=""><br class=""></div><div class=""><pre style="font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51,51,51)" class=""><code style="font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;padding:0px;margin:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border:0px;display:inline;overflow:visible;line-height:inherit;word-wrap:normal" class="">/// Returns the contiguous memory footprint of `T`.
///
/// Does not include any dynamically-allocated or "remote" storage.
/// In particular, `size(X.self)`, when `X` is a class type, is the
/// same regardless of how many stored properties `X` has.
public func size&lt;T&gt;(_: T.Type) -&gt; Int

/// Returns the contiguous memory footprint of  `T`.
///
/// Does not include any dynamically-allocated or "remote" storage.
/// In particular, `size(of: a)`, when `a` is a class instance, is the
/// same regardless of how many stored properties `a` has.
public func size&lt;T&gt;(of: T) -&gt; Int

/// Returns the least possible interval between distinct instances of
/// `T` in memory.  The result is always positive.
public func spacing&lt;T&gt;(_: T.Type) -&gt; Int

/// Returns the least possible interval between distinct instances of
/// `T` in memory.  The result is always positive.
public func spacing&lt;T&gt;(of: T) -&gt; Int

/// Returns the minimum memory alignment of `T`.
public func alignment&lt;T&gt;(_: T.Type) -&gt; Int

/// Returns the minimum memory alignment of `T`.
public func alignment&lt;T&gt;(of: T) -&gt; Int</code></pre></div><div class="">-- E</div></div></div></blockquote></div></div></blockquote></div>
</div></blockquote></div><br class=""></body></html>