[swift-evolution] [Proposal] Protected Access Level

Vanderlei Martinelli vmartinelli at alecrim.com
Sun May 29 18:59:53 CDT 2016


I missed the last part when you are talking about bridging TO Objective-C,
but Rod Brown answered that very well (thanks).

-Van

On Sun, May 29, 2016 at 8:50 PM, Vanderlei Martinelli <
vmartinelli at alecrim.com> wrote:

> Hi Leonardo.
>
> Thank you for your answer.
>
> I understand your point of view and I agree that it is better to look
> forward. But today we still have to deal with decades of legacy Cocoa code
> written using classes. If tomorrow a new set of Cocoa frameworks written in
> Swift using protocols appears, maybe we can forget all of this discussion.
> But OOP is very important and don't think it is the "past". I see future in
> "POP" as I see in "OOP" and I think we can have OOP and POP living in
> harmony in Swift. And since we have support to classes in Swift, I think it
> shall have a full featured support for classes.
>
> Perhaps my reaction in the last message sounds like I am overreacting when
> seen in the context of this thread. But I am programming in Swift since the
> first day it was publicly available (and I think that the first almost
> usable version to create real world apps was the 1.2). Since the old
> forums, when Swift was not yet open source, I have been insisting on
> certain improvements.
>
> About bridging member declarations from Objective-C, many of these classes
> already have separated headers with the members intended to be overrided.
> Exceptions to this rule could be "annotated" somehow. (I would like to
> mention classes that are entirely intended to be subclassed and not used as
> is in Cocoa frameworks, but this is about "abstract" access level modifier
> and not part of this proposal.)
>
> Regards,
>
> Vanderlei Martinelli
>
>
>
>
>
>
>
>
> On Sun, May 29, 2016 at 7:45 PM, Leonardo Pessoa <me at lmpessoa.com> wrote:
>
>> 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.
>>
>> 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?
>> ------------------------------
>> From: Vanderlei Martinelli via swift-evolution
>> <swift-evolution at swift.org>
>> Sent: ‎29/‎05/‎2016 06:56 PM
>> To: swift-evolution <swift-evolution at swift.org>
>> Subject: Re: [swift-evolution] [Proposal] Protected Access Level
>>
>> Thank you all for your comments. :-)
>>
>> 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.
>>
>> "Protected" access level is not a new concept at all (except for the
>> Swift language), so I did not propose anything preposterous.
>>
>> 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.
>>
>> 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.
>>
>>
>> Regards,
>>
>> Vanderlei Martinelli
>>
>>
>>
>>
>>>
>>>
>>
>> On Sat, May 28, 2016 at 7:52 PM, Vanderlei Martinelli <
>> vmartinelli at alecrim.com> wrote:
>>
>>> Hello.
>>>
>>>
>>> This is the first draft. I'd like to know your opinion about it.
>>>
>>> (I know that this subject could have been discussed before. If so,
>>> please indicate me the correct thread to follow and interact.)
>>>
>>>
>>> Regards,
>>>
>>> Vanderlei Martinelli
>>>
>>>
>>> ---
>>>
>>>
>>> Introduction
>>>
>>> Protected access level will enable entities to be used within the
>>> container type and by derived types only.
>>> Motivation
>>>
>>> Today Swift has three access levels (public, internal and private), but
>>> lacks a way to describe a member that can be only visible to its type or
>>> derived types.
>>>
>>> A common case is the UIView from UIKit. Many developers are tempted to
>>> make this call:
>>>
>>> view.layoutSubviews()
>>>
>>> The documentation says: "You should not call this method directly. If
>>> you want to force a layout update, call the setNeedsLayoutmethod
>>> instead to do so prior to the next drawing update. If you want to update
>>> the layout of your views immediately, call the layoutIfNeeded method."
>>>
>>> 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"):
>>>
>>> public override func layoutSubviews() {
>>>     // We are calling the super method directly here.
>>>     super.layoutSubviews()
>>>
>>>     // Do more adjustments to this view's subviews...}
>>>
>>> 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.
>>>
>>> In Objective-C problems like this are usually "solved" my adding a kind
>>> of "protected" header (.h) 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...
>>>
>>> protected func layoutSubviews()
>>>
>>> ... no one outside the class or derived classes would be allowed to call
>>> this method directly.
>>>
>>> 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
>>> protected access level would be very usefull.
>>> Proposed solution
>>>
>>> Create the protected access level.
>>> Detailed designReference Types (classes)
>>>
>>> When declarated by a class the protected member will be visible to the
>>> class itself and all the derived classes.
>>>
>>> // BaseClass.swiftpublic class BaseClass {
>>>     public protected(set) var x = 20
>>>     protected let y = 10
>>>
>>>     protected func doSomething() {
>>>         // ...
>>>     }}
>>> // DerivedClass.swiftpublic class DerivedClass: BaseClass {
>>>     protected override doSomething() {
>>>         self.x = 10 * self.y
>>>     }}
>>>
>>> If the member is declared as final then it will be visible but not can
>>> be overrided by the derived classes. Just like it works with other access
>>> levels.
>>> Value Types (structs, enums, etc.)
>>>
>>> Value types cannot have derived types. In this case the protected access
>>> level does not make sense and will not be allowed in their members.
>>> Protocols
>>>
>>> Protocols do not declare access level for their members. So the
>>> protected�
>>>
>>
>> [The entire original message is not included.]
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160529/407b6ee3/attachment.html>


More information about the swift-evolution mailing list