<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=""><div class="">I agree that we should be looking for what makes sense, not just what we’ve seen in other languages. That said, there seems a lot of hate for OOP in general that seems to be clouding people’s vision here.</div><div class=""><br class=""></div><div class="">I think that “protected” as a form of access control is exactly what we want: rights that subclasses should be allowed, but other classes should not. Generally they refer to internal state that only the class itself, or its subclass, has any business either updating or calling.</div><div class=""><br class=""></div><div class="">Lets drop the word “protected” for a second and actually examine the use cases for differing access control in classes. I think the best example of this in different contexts are:</div><div class=""><br class=""></div><div class="">1. Methods and properties that only subclasses must access, but other code has no business updating. An example of this UIGestureRecognizer. State machine type access is something where external items should not access, but internal state may require the rights to update.</div><div class=""><br class=""></div><div class="">2. Methods and properties that should be overridable, but are helper methods and shouldn’t be called by external methods, and perhaps shouldn’t be even called directly. This includes -layoutSubviews on UIView, a multitude of other methods in UIKit, etc. Thus I think Brent had a good point that calling a method might need to have different access rights to overriding it.</div><div class=""><br class=""></div><div class="">I think #1 shows specifically the need for access control for subclasses only, and thus a ‘protected’- style access control level.</div><div class="">I think #2 shows a need to differentiate the access rights of calling a method from access rights to see or override the method.</div><div class=""><br class=""></div><div class="">While we can find workarounds that obfuscate access, these aren’t access controls, they’re convoluted workarounds to avoid correcting our access control rules in the first place.</div><div class=""><br class=""></div><div class="">How do these things bridge into Objective-C?</div><div class="">Protected doesn’t make sense in Objective-C. You cannot subclass a Swift Class in Objective C, so overriding is irrelevant. I suspect the rule should be simple: Anything Protected should not be visible to Objective-C, much like private is hidden currently.</div><div class=""><br class=""></div><div class="">- Rod</div><div class=""><br class=""></div><br class=""><div><blockquote type="cite" class=""><div class="">On 30 May 2016, at 8:45 AM, Leonardo Pessoa 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="font-family: Helvetica; font-size: 12px; 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 style="font-family: Calibri, sans-serif; font-size: 11pt;" class="">Vanderlei, my point in bringing such topics to this discussion is to make everyone here think if we're trying to really enhance the language within its intended purpose or if we're trying to change the language into something else were familiar with from other languages we work/ed with just because we're used to work like that. I just started thinking about this today and just cannot stop now. No intention to start a war here but I think everyone should ask themselves this for every proposed change to the language.<br class=""><br class="">About the topic at-hand, we have to remember Swift is bridged to Objective-C, which has no protected (or abstract). How do you propose these protected members be bridged should the proposal pass?<br class=""></div></div><div dir="ltr" style="font-family: Helvetica; font-size: 12px; 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=""><hr class=""><span style="font-family: Calibri, sans-serif; font-size: 11pt; font-weight: bold;" class="">From:<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: Calibri, sans-serif; font-size: 11pt;" class=""><a href="mailto:swift-evolution@swift.org" class="">Vanderlei Martinelli via swift-evolution</a></span><br class=""><span style="font-family: Calibri, sans-serif; font-size: 11pt; font-weight: bold;" class="">Sent:<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: Calibri, sans-serif; font-size: 11pt;" class="">‎29/‎05/‎2016 06:56 PM</span><br class=""><span style="font-family: Calibri, sans-serif; font-size: 11pt; font-weight: bold;" class="">To:<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: Calibri, sans-serif; font-size: 11pt;" class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution</a></span><br class=""><span style="font-family: Calibri, sans-serif; font-size: 11pt; font-weight: bold;" class="">Subject:<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: Calibri, sans-serif; font-size: 11pt;" class="">Re: [swift-evolution] [Proposal] Protected Access Level</span><br class=""><br class=""></div><div dir="ltr" style="font-family: Helvetica; font-size: 12px; 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="">Thank you all for your comments. :-)</div><div class=""><br class=""></div><div class="">Well... My goal is to keep the thing really simple and do not start a new "OOP x POP" (or "something" x "other thing") war.</div><div class=""><br class=""></div><div class="">"Protected" access level is not a new concept at all (except for the Swift language),&nbsp;so I did not propose anything preposterous.<br class=""></div><div class=""><br class=""></div><div class="">Of course in the Swift of my dreams we also have "abstract" access level modifier, "protected" access level, *real* "private" access level and "file" access level modifier (along with many, many other things, of course). But this proposal is not about this. It is only about include the "protected" access level.</div><div class=""><br class=""></div><div class="">There is, however, something that I need to get off my chest: I really would like to have the freedom to go to the depths with protocols as well with classes. I work in real apps everyday that uses Cocoa frameworks (based on classes) and these apps must be shipped and I like them well written. Maybe am I insane for proposing a better support for classes in Swift? If so, this explains why every time I suggest better support for classes in Swift there is an endless discussion and someone proclaims the death of OOP and is it. OK... Maybe someday we will not have more classes in Swift. Until there: the current language status is the best way to handle OOP in Swift? Or is there a better way? I think there is.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Regards,</div><div class=""><br class=""></div><div class="">Vanderlei Martinelli</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><div dir="ltr" class=""><div class=""><br class=""></div><div class=""><br class=""></div></div></blockquote></div><br class=""></div></div><div class="gmail_extra" style="font-family: Helvetica; font-size: 12px; 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;"><br class=""><div class="gmail_quote">On Sat, May 28, 2016 at 7:52 PM, Vanderlei Martinelli<span class="Apple-converted-space">&nbsp;</span><span dir="ltr" class="">&lt;<a href="mailto:vmartinelli@alecrim.com" target="_blank" class="">vmartinelli@alecrim.com</a>&gt;</span><span class="Apple-converted-space">&nbsp;</span>wrote:<br class=""><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><div dir="ltr" class="">Hello.<div class=""><br class=""></div><div class=""><br class=""></div><div class="">This is the first draft. I'd like to know your opinion about it.</div><div class=""><br class=""></div><div class="">(I know that this subject could have been discussed before. If so, please indicate me the correct thread to follow and interact.)</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Regards,</div><div class=""><br class=""></div><div class="">Vanderlei Martinelli</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">---</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><h2 style="margin: 20px 0px 10px; padding: 0px; font-family: Helvetica, arial, sans-serif; font-size: 24px; border-bottom-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: solid;" class="">Introduction</h2><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">Protected access level will enable entities to be used within the container type and by derived types only.</p><h2 style="margin: 20px 0px 10px; padding: 0px; font-family: Helvetica, arial, sans-serif; font-size: 24px; border-bottom-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: solid;" class="">Motivation</h2><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">Today Swift has three access levels (<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">public</code>,&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">internal</code>&nbsp;and&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">private</code>), but lacks a way to describe a member that can be only visible to its type or derived types.</p><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">A common case is the&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">UIView</code>&nbsp;from UIKit. Many developers are tempted to make this call:</p><div style="font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><pre style="padding: 1em 1em 1em 3.8em; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(204, 204, 204); border-image-source: none; line-height: 1.5; overflow: auto; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 13px; margin-top: 0.5em; margin-bottom: 0.5em; word-spacing: normal; background-color: rgb(245, 242, 240);" class=""><code style="margin: 0px; padding: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: currentcolor; border-image-source: none; line-height: 1.5; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; word-spacing: normal; background-image: none;" class="">view<span style="color: rgb(153, 153, 153);" class="">.</span><span style="color: rgb(221, 74, 104);" class="">layoutSubviews</span><span style="color: rgb(153, 153, 153);" class="">(</span><span style="color: rgb(153, 153, 153);" class="">)</span><span style="width: 3em; letter-spacing: -1px; border-right-color: rgb(153, 153, 153); border-right-width: 1px; border-right-style: solid;" class=""><span style="display: block;" class=""></span></span></code></pre></div><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">The documentation says: "You should not call this method directly. If you want to force a layout update, call the&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">setNeedsLayout</code>method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">layoutIfNeeded</code>&nbsp;method."</p><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">But yes, you should call this method directly if you are subclassing the view and needs to perform additional layout to its subviews ("subclasses can override this method as needed"):</p><div style="font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><pre style="padding: 1em 1em 1em 3.8em; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(204, 204, 204); border-image-source: none; line-height: 1.5; overflow: auto; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 13px; margin-top: 0.5em; margin-bottom: 0.5em; word-spacing: normal; background-color: rgb(245, 242, 240);" class=""><code style="margin: 0px; padding: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: currentcolor; border-image-source: none; line-height: 1.5; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; word-spacing: normal; background-image: none;" class=""><span style="color: rgb(0, 119, 170);" class="">public</span> <span style="color: rgb(0, 119, 170);" class="">override</span> <span style="color: rgb(0, 119, 170);" class="">func</span> <span style="color: rgb(221, 74, 104);" class="">layoutSubviews</span><span style="color: rgb(153, 153, 153);" class="">(</span><span style="color: rgb(153, 153, 153);" class="">)</span> <span style="color: rgb(153, 153, 153);" class="">{</span>
    <span style="color: rgb(112, 128, 144);" class="">// We are calling the super method directly here.</span>
    <span style="color: rgb(0, 119, 170);" class="">super</span><span style="color: rgb(153, 153, 153);" class="">.</span><span style="color: rgb(221, 74, 104);" class="">layoutSubviews</span><span style="color: rgb(153, 153, 153);" class="">(</span><span style="color: rgb(153, 153, 153);" class="">)</span>
    
    <span style="color: rgb(112, 128, 144);" class="">// Do more adjustments to this view's subviews...</span>
<span style="color: rgb(153, 153, 153);" class="">}</span><span style="width: 3em; letter-spacing: -1px; border-right-color: rgb(153, 153, 153); border-right-width: 1px; border-right-style: solid;" class=""><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span></span></code></pre></div><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">So, yes, we can call this method directly when subclassing, but the Swift compiler will not prevent you from do this when not subclassing or from any other foreign class. It will not even issue a warning.</p><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">In Objective-C problems like this are usually "solved" my adding a kind of "protected" header (<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">.h</code>) that is intended to be included only when the developer is subclassing. In Swift we do not have headers, but we have the new access level model. So, if the declaration of this method was...</p><div style="font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><pre style="padding: 1em 1em 1em 3.8em; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(204, 204, 204); border-image-source: none; line-height: 1.5; overflow: auto; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 13px; margin-top: 0.5em; margin-bottom: 0.5em; word-spacing: normal; background-color: rgb(245, 242, 240);" class=""><code style="margin: 0px; padding: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: currentcolor; border-image-source: none; line-height: 1.5; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; word-spacing: normal; background-image: none;" class="">protected <span style="color: rgb(0, 119, 170);" class="">func</span> <span style="color: rgb(221, 74, 104);" class="">layoutSubviews</span><span style="color: rgb(153, 153, 153);" class="">(</span><span style="color: rgb(153, 153, 153);" class="">)</span><span style="width: 3em; letter-spacing: -1px; border-right-color: rgb(153, 153, 153); border-right-width: 1px; border-right-style: solid;" class=""><span style="display: block;" class=""></span></span></code></pre></div><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">... no one outside the class or derived classes would be allowed to call this method directly.</p><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">Of course, there are other cases in the Cocoa frameworks and there are many other cases when we are developing software in Swift that the&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">protected</code>&nbsp;access level would be very usefull.</p><h2 style="margin: 20px 0px 10px; padding: 0px; font-family: Helvetica, arial, sans-serif; font-size: 24px; border-bottom-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: solid;" class="">Proposed solution</h2><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">Create the&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">protected</code>&nbsp;access level.</p><h2 style="margin: 20px 0px 10px; padding: 0px; font-family: Helvetica, arial, sans-serif; font-size: 24px; border-bottom-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: solid;" class="">Detailed design</h2><h3 style="margin: 20px 0px 10px; padding: 0px; font-family: Helvetica, arial, sans-serif; font-size: 18px;" class="">Reference Types (classes)</h3><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">When declarated by a&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">class</code>&nbsp;the protected member will be visible to the class itself and all the derived classes.</p><div style="font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><pre style="padding: 1em 1em 1em 3.8em; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(204, 204, 204); border-image-source: none; line-height: 1.5; overflow: auto; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 13px; margin-top: 0.5em; margin-bottom: 0.5em; word-spacing: normal; background-color: rgb(245, 242, 240);" class=""><code style="margin: 0px; padding: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: currentcolor; border-image-source: none; line-height: 1.5; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; word-spacing: normal; background-image: none;" class=""><span style="color: rgb(112, 128, 144);" class="">// BaseClass.swift</span>
<span style="color: rgb(0, 119, 170);" class="">public</span> <span style="color: rgb(0, 119, 170);" class="">class</span> <span class="">BaseClass</span> <span style="color: rgb(153, 153, 153);" class="">{</span>
    <span style="color: rgb(0, 119, 170);" class="">public</span> <span style="color: rgb(221, 74, 104);" class="">protected</span><span style="color: rgb(153, 153, 153);" class="">(</span><span style="color: rgb(0, 119, 170);" class="">set</span><span style="color: rgb(153, 153, 153);" class="">)</span> <span style="color: rgb(0, 119, 170);" class="">var</span> x <span style="color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039);" class="">=</span> <span style="color: rgb(153, 0, 85);" class="">20</span>
    protected <span style="color: rgb(0, 119, 170);" class="">let</span> y <span style="color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039);" class="">=</span> <span style="color: rgb(153, 0, 85);" class="">10</span>
    
    protected <span style="color: rgb(0, 119, 170);" class="">func</span> <span style="color: rgb(221, 74, 104);" class="">doSomething</span><span style="color: rgb(153, 153, 153);" class="">(</span><span style="color: rgb(153, 153, 153);" class="">)</span> <span style="color: rgb(153, 153, 153);" class="">{</span>
        <span style="color: rgb(112, 128, 144);" class="">// ...</span>
    <span style="color: rgb(153, 153, 153);" class="">}</span>
<span style="color: rgb(153, 153, 153);" class="">}</span>

<span style="color: rgb(112, 128, 144);" class="">// DerivedClass.swift</span>
<span style="color: rgb(0, 119, 170);" class="">public</span> <span style="color: rgb(0, 119, 170);" class="">class</span> <span class="">DerivedClass</span><span style="color: rgb(153, 153, 153);" class="">:</span> <span style="color: rgb(102, 153, 0);" class="">BaseClass</span> <span style="color: rgb(153, 153, 153);" class="">{</span>
    protected <span style="color: rgb(0, 119, 170);" class="">override</span> <span style="color: rgb(221, 74, 104);" class="">doSomething</span><span style="color: rgb(153, 153, 153);" class="">(</span><span style="color: rgb(153, 153, 153);" class="">)</span> <span style="color: rgb(153, 153, 153);" class="">{</span>
        <span style="color: rgb(0, 119, 170);" class="">self</span><span style="color: rgb(153, 153, 153);" class="">.</span>x <span style="color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039);" class="">=</span> <span style="color: rgb(153, 0, 85);" class="">10</span> <span style="color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039);" class="">*</span> <span style="color: rgb(0, 119, 170);" class="">self</span><span style="color: rgb(153, 153, 153);" class="">.</span>y
    <span style="color: rgb(153, 153, 153);" class="">}</span>
<span style="color: rgb(153, 153, 153);" class="">}</span><span style="width: 3em; letter-spacing: -1px; border-right-color: rgb(153, 153, 153); border-right-width: 1px; border-right-style: solid;" class=""><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span><span style="display: block;" class=""></span></span></code></pre></div><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">If the member is declared as&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">final</code>&nbsp;then it will be visible but not can be overrided by the derived classes. Just like it works with other access levels.</p><h3 style="margin: 20px 0px 10px; padding: 0px; font-family: Helvetica, arial, sans-serif; font-size: 18px;" class="">Value Types (structs, enums, etc.)</h3><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">Value types cannot have derived types. In this case the&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">protected</code>&nbsp;access level does not make sense and will not be allowed in their members.</p><h3 style="margin: 20px 0px 10px; padding: 0px; font-family: Helvetica, arial, sans-serif; font-size: 18px;" class="">Protocols</h3><p style="margin: 15px 0px; font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">Protocols do not declare access level for their members. So the&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image-source: none; white-space: nowrap; background-color: rgb(248, 248, 248);" class="">protected</code>�</p></div></div></blockquote></div></div><br style="font-family: Helvetica; font-size: 12px; 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 style="font-family: Helvetica; font-size: 12px; 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="">[The entire original message is not included.]</div><span style="font-family: Helvetica; font-size: 12px; 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; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica; font-size: 12px; 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="font-family: Helvetica; font-size: 12px; 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; float: none; display: inline !important;" class="">swift-evolution mailing list</span><br style="font-family: Helvetica; font-size: 12px; 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=""><a href="mailto:swift-evolution@swift.org" style="font-family: Helvetica; font-size: 12px; 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="">swift-evolution@swift.org</a><br style="font-family: Helvetica; font-size: 12px; 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=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family: Helvetica; font-size: 12px; 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="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div><br class=""></body></html>