<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div><br></div><div><br>On 10 Apr 2017, at 05:08, Jose Cheyo Jimenez via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><meta http-equiv="Content-Type" content="text/html charset=utf-8"><div class=""><br class=""></div><div><blockquote type="cite" class=""><div class="">On Apr 9, 2017, at 7:14 PM, Jonathan Hull 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=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">This struck me as a bit odd at first, but the more I think about it, the more I really like the ability to nest extensions/scopes. &nbsp;The one issue I see is sticking that public extension inside a private one. &nbsp;I think you would have to mark ‘secret: Int’ as private instead of the extension itself to allow the effect you are looking for...<div class=""><div class=""><br class=""></div><div class="">What I ultimately want is the ability to declare storage in extensions in the same submodule. Combining that with fileprivate will allow the same tricks without the indentation (together in their own file). &nbsp;This nesting will help in the mean-time (and would still be useful after for those who prefer to organize their code in fewer/longer files). &nbsp;I think it could be helpful in other ways too…</div></div></div></div></blockquote><div><br class=""></div>What do you think of `partial` types like C# but limited to a file?</div><div><a href="https://msdn.microsoft.com/en-us/library/wbx7zzdd.aspx" class="">https://msdn.microsoft.com/en-us/library/wbx7zzdd.aspx</a></div><div><br class=""></div><div><a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20170403/035360.html" class="">https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20170403/035360.html</a></div><div><br></div></div></blockquote><div><br></div><div>That's the direction the new proposal (0169) is going towards with extensions in the same file.</div><br><blockquote type="cite"><div><div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><div class=""><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Jon</div><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Apr 8, 2017, at 5:03 AM, Tino Heth 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 style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Imho there is a simple solution to reach the goals of SE-0169&nbsp;without breaking compatibility:<div class="">Just allow extensions inside type declarations.</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(112, 61, 170);" class=""><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class=""><span style="color: #ba2da2" class="">class</span><span style="" class=""> MyVC: </span>UIViewController<span style="" class=""> {</span></div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; <span style="color: #ba2da2" class="">private</span> <span style="color: #ba2da2" class="">let</span> numberOfSections = <span style="color: #272ad8" class="">0</span></div><div style="margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class=""><span style="" class="">&nbsp; &nbsp; </span><span style="color: #ba2da2" class="">extension</span><span style="" class="">: </span>UITableViewDataSource<span style="" class=""> {</span></div><div style="margin: 0px; line-height: normal; color: rgb(0, 132, 0);" class=""><span style="" class="">&nbsp; &nbsp; &nbsp; &nbsp; </span>// Skipping the class and assume we want to extend the surrounding type</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ba2da2" class="">func</span> numberOfSections(in tableView: <span style="color: #703daa" class="">UITableView</span>) -&gt; <span style="color: #703daa" class="">Int</span> {</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ba2da2" class="">return</span> numberOfSections</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ba2da2" class="">func</span> tableView(<span style="color: #ba2da2" class="">_</span> tableView: <span style="color: #703daa" class="">UITableView</span>, numberOfRowsInSection section: <span style="color: #703daa" class="">Int</span>) -&gt; <span style="color: #703daa" class="">Int</span> {</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ba2da2" class="">return</span> <span style="color: #272ad8" class="">0</span></div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal; color: rgb(186, 45, 162);" class=""><span style="" class="">&nbsp; &nbsp; </span>private<span style="" class=""> </span>extension<span style="" class=""> {</span></div><div style="margin: 0px; line-height: normal; color: rgb(0, 132, 0);" class=""><span style="" class="">&nbsp; &nbsp; &nbsp; &nbsp; </span>// this would contain everything that shoudn't be visible for other extensios</div><div style="margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ba2da2" class="">var</span> secret: <span style="color: #703daa" class="">Int</span> = <span style="color: #272ad8" class="">0</span></div><div style="margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal; color: rgb(186, 45, 162);" class=""><span style="" class="">&nbsp; &nbsp; &nbsp; &nbsp; </span>public<span style="" class=""> </span>extension<span style="" class=""> </span><span style="color: #703daa" class="">MyFriendClass</span><span style="" class=""> {</span></div><div style="margin: 0px; line-height: normal; color: rgb(0, 132, 0);" class=""><span style="" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>// oh, well, I make an exception here for a trustworthy type</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ba2da2" class="">func</span> checkSecret(of controller: <span style="color: #4f8187" class="">MyVC</span>) -&gt; <span style="color: #703daa" class="">Bool</span> {</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ba2da2" class="">return</span> controller.secret &gt; <span style="color: #272ad8" class="">0</span></div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal; color: rgb(186, 45, 162);" class=""><span style="" class="">&nbsp; &nbsp; &nbsp; &nbsp; </span>private<span style="" class=""> </span>extension<span style="" class=""> {</span></div><div style="margin: 0px; line-height: normal; color: rgb(0, 132, 0);" class=""><span style="" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>// this is so secret, I'm not even allowed to copy it</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; <span style="color: #ba2da2" class="">public</span> <span style="color: #ba2da2" class="">func</span> myMethod() {</div><div style="margin: 0px; line-height: normal; color: rgb(209, 47, 27);" class=""><span style="" class="">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #3e1e81" class="">print</span><span style="" class="">(</span>"This is just a boring method"<span style="" class="">)</span></div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal;" class="">}</div><div class=""><br class=""></div></div></div></div></div></div></div><div class="">It has the downside of shifting code to the right (you could as well leave those extension-blocks unindented), but lots of advantages:</div><div class="">- No change for private needed</div><div class="">- It can be nested as much as you like to satisfy even the most absurd desires of encapsulation</div><div class="">- It reminds me on operator definitions inside type declarations&nbsp;</div><div class="">- No change for fileprivate needed (but actually, I think there is very little need to keep fileprivate)</div><div class=""><br class=""></div><div class="">I wish this would only be a joke, but writing the example, I actually started liking the concept (but I have a terrible headache right now which might affect my mind) — so either this receives some feedback, or I might start re-proposing this ;-)</div><br class=""><div class="">- Tino</div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></div></div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></body></html>