<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 Feb 17, 2017, at 6:10 PM, Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com" class="">matthew@anandabits.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""><br class="">Sent from my iPad</div><div style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="">On Feb 17, 2017, at 6:52 PM, Jose Cheyo Jimenez &lt;<a href="mailto:cheyo@masters3d.com" class="">cheyo@masters3d.com</a>&gt; wrote:<br class=""><br class=""></div><blockquote type="cite" style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class=""><div class=""><div style="font-family: Helvetica, arial, sans-serif; font-size: 14px; -webkit-print-color-adjust: exact; margin: 0px 0px 15px;" class=""><br class="webkit-block-placeholder"></div><span class="" style="font-size: 14px;">From Ted.</span><br class=""><blockquote type="cite" class=""><p class="" style="font-family: Helvetica, arial, sans-serif; font-size: 14px; -webkit-print-color-adjust: exact; margin: 0px 0px 15px;">Relative to Swift 3, the bar for such changes is significantly higher:</p><ul class="" style="font-family: Helvetica, arial, sans-serif; font-size: 14px; -webkit-print-color-adjust: exact; margin: 15px 0px; padding-left: 30px;"><li class="" style="-webkit-print-color-adjust: exact; margin: 0px;">The existing syntax/API being changed must be&nbsp;<em class="" style="-webkit-print-color-adjust: exact; margin-top: 0px;">actively harmful</em>.</li><li class="" style="-webkit-print-color-adjust: exact; margin: 0px;">The new syntax/API must&nbsp;<em class="" style="-webkit-print-color-adjust: exact; margin-top: 0px;">clearly</em>&nbsp;be better and not conflict with existing Swift syntax.</li><li class="" style="-webkit-print-color-adjust: exact; margin: 0px;">There must be a&nbsp;<em class="" style="-webkit-print-color-adjust: exact; margin-top: 0px;">reasonably automatable migration path</em>&nbsp;for existing code.</li></ul></blockquote></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;">I don’t think there is evidence that scope private in Swift3 is "actively harmful”.&nbsp;</span><br class=""><span class="" style="font-size: 14px;">Reverting to Swift2&nbsp;file-private&nbsp;as private is not&nbsp;<i class="">clearly</i>&nbsp;better.&nbsp;</span></div><div class=""><span class="" style="font-size: 14px;">The community has not&nbsp;converged on a clear winner.&nbsp;</span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;">The only positive thing here is that&nbsp;if we get rid of scope&nbsp;private then it will be easy to make private alias to&nbsp;file-private so no code will break, but we would be removing a feature so I would think this is a&nbsp;breaking change.&nbsp;</span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;">Would removing private and fileprivate by making them alias to internal also be a breaking change? Even if the code will still compile?</span></div></div></blockquote><div style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">Thanks for posting this Jose. &nbsp;<span style="background-color: rgba(255, 255, 255, 0);" class="">I think the point that has near unanimous agreement is that assigning `private` the meaning of scoped access was a mistake. &nbsp;`fileprivate` is too awkward given how frequently it is necessary in common idioms of Swift code organization. &nbsp;</span></div><div style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div><div style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">Whether scoped access itself is a valuable feature and whether it should remain is the question that is turning out to be very controversial. &nbsp;The mistake we made with the keywords in Swift 3 certainly didn't help make the case for it. &nbsp;</span></div><div style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div><div style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">That's why I would like to see us try to fix that mistake. &nbsp;I think everyone can be reasonably happy if we can all use `private` the way we did in Swift 2 and `scoped` can become a style issue. &nbsp;Some teams can have a linter reject it and those of us who like it can continue using it. &nbsp;As a bonus, we would eliminate an awkward keyword.</span></div></div></blockquote><div><br class=""></div><div>I appreciate the enthusiasm about this but the same argument can be used the other way.&nbsp;</div><div><br class=""></div><div>What about renaming `fileprivate` to `<span style="font-size: 14px;" class="">privy</span>`. Shorter than private, typing `pri` would auto complete to it, &nbsp;more swifty. Win Win. :)&nbsp;</div><div><br class=""></div><div>Its going to be hard finding names for either scope private or file private that the community will agree with.&nbsp;</div><div><br class=""></div><div>Its going to be a hard sale given the other more important features being worked on.</div><br class=""><blockquote type="cite" class=""><div class=""><br style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class=""><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;">This is a linter problem. If people&nbsp;don’t want other people in their team to use scope private then make it part of the&nbsp;coding style.&nbsp;</span></div><div class=""><br class=""></div><div class=""><span class="" style="font-size: 14px;">If people do not want fileprivate because it looks ugly, then force everybody to use scope private using a linter&nbsp;like swiftlint.&nbsp;</span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><span class="" style="font-size: 14px;"><br class=""></span></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Feb 17, 2017, at 2:35 PM, Matthew Johnson 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=""><br class=""><blockquote type="cite" class="">On Feb 17, 2017, at 4:29 PM, Brent Royal-Gordon via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><br class=""><blockquote type="cite" class="">On Feb 17, 2017, at 12:29 AM, Slava Pestov via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><br class="">Personally I feel enforced encapsulation of implementation detail to the latter group is less important than the former, and can be handled by convention. Whereas other users of your module definitely benefit from access control and being able to consume a clearly-defined interface.<br class=""></blockquote><br class="">I think failing to provide some sort of below-`internal` privacy would be missing *really* low-hanging fruit for no good reason. The languages I can think of which don't include some sort of sub-library-wide privacy level—Objective-C, Javascript, Perl, Python—usually have very simple object designs with a flat namespace. (Well, there's Rust, but Rust lets you wrap anything you'd like in a module.) Even Objective-C in practice includes a `fileprivate` equivalent in the form of methods declared only in the .m file.<br class=""><br class="">I also think it's often helpful to be able to change a member's access level without having to change all references to it. Publishing or privatizing an interface is not an uncommon refactoring.<br class=""><br class="">Not everybody likes our current semantics, but that's no reason to throw the feature out entirely.<br class=""></blockquote><br class="">+1. &nbsp;I’d like to see `private` revert to the Swift 2 meaning, and hopefully we can reconsider using `scoped` as the keyword for scoped access rather than abandoning it. &nbsp;Does anyone remember why this was considered a bad idea?<br class=""><br class=""><blockquote type="cite" class=""><br class="">--<span class="Apple-converted-space">&nbsp;</span><br class="">Brent Royal-Gordon<br class="">Architechies<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=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></blockquote><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=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></div></blockquote></div></div></blockquote></div></blockquote></div><br class=""></body></html>