<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="">+1000<div class=""><br class=""></div><div class="">This is the way it always should have worked… and it is the way my brain still expects it to work. &nbsp;All of the extraneous “Public”s clutter the code and make it much more difficult to read. &nbsp;Without it, the relatively few properties marked Internal or Private stand out.</div><div class=""><br class=""></div><div class="">I know there is the argument about making people think about whether they want to expose each item… but it doesn’t work that way. &nbsp;Once you assign someone a rote task (assigning Public to most of the things), you lose the effect of having them think. &nbsp;From a cognitive psychology lens, when you give the brain a number of decisions to make in a row that are very similar, it will naturally make that task more efficient by automating as much of it as possible (i.e. thinking about it less). &nbsp;Mistakes become much more likely as a result.</div><div class=""><br class=""></div><div class="">Tl;dr: <b class="">&nbsp;</b>Despite the<b class=""> myth</b>/intention<b class="">&nbsp;</b>that the current setup makes you<b class=""> think about the problem more,</b> it actually does the<b class=""> opposite</b>&nbsp;and leads to an <b class="">increased risk of error</b>.</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Jon</div><div class=""><br class=""></div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Sep 28, 2017, at 10:44 AM, James Valaitis 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="">When declaring a public class or struct the properties still default to internal.<br class="">```<br class="">public final class NewType {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>/// This property defaults to internal.<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>var property: Any?<br class="">}<br class="">```<br class=""><br class="">This is not the same for a public extension on the type, where then the access modifier is respected for any function or calculated property within the extension.<br class="">```<br class="">public extension NewType {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>/// This function inherits the public modifier.<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>func function() {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>}<br class="">}<br class="">```<br class=""><br class="">I dislike this inconsistency, and I frequently find that when using my dynamic frameworks my code will not compile, and it will be due to my accidentally writing a public struct but not declaring the properties public.<br class=""><br class="">I believe in the idea that explicitly stating the access modifier leads to more legible code, but in my opinion it can be overdone, and I much prefer to explicitly state my intentions in the modifier on the definition or extension. For example:<br class=""><br class="">```<br class="">public struct Coordinate {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>/// Should default to public.<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let latitude: Double<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>/// Should default to public.<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let longitude: Double<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>/// Should default to public<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>init?(latitude: Double, longitude: Double) {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>guard validate(latitude: latitude, longitude: longitude) else { return nil }<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>…<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>}<br class="">}<br class="">internal extension Coordinate {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>/// Convenience initialiser to me used internally within the module.<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>init(coordinate: CLLocationCoordinate2D) {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>…<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>}<br class="">}<br class="">private extension Coordinate {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>/// Private validation of the coordinate.<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>func validate(latitude: Double, longitude: Double) -&gt; Bool {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>…<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>}<br class="">}<br class="">```<br class=""><br class="">This is legible and intuitive. The current behaviour is not.<br class=""><br class="">_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></div></blockquote></div><br class=""></div></body></html>