[swift-evolution] final + lazy + fileprivate modifiers

Brent Royal-Gordon brent at architechies.com
Sat Feb 18 05:05:01 CST 2017

> On Feb 17, 2017, at 2:15 PM, Joanna Carter via swift-evolution <swift-evolution at swift.org> wrote:
> There are also times when I want to declare a base class that I am expecting users to derive from, especially an abstract class. I want a means of declaring that certain stuff can only be overridden by subclasses but, most definitely, not callable from any code outside of that hierarchy. For that, I express that intent by declaring such stuff as protected, thus preventing "unauthorised" use from outside the intended hierarchy.

Let's be clear here: Are you thinking of this exclusively as a feature for override points, or are you asking for a `protected` feature in general?

I think that a general `protected` feature is not very compatible with Swift's extension-based approach, but I could imagine a feature specifically for overriding. For example, a class like UIViewController might declare:

	open(override) internal func viewDidAppear(_ animated: Bool) { … }
	// Or maybe `open internal(call)`? That'd be more like `public internal(set)`…

And then public subclasses could override `viewDidAppear(_:)`, and those overrides could call `super.viewDidAppear(_:)`, but neither other methods in the subclass nor code outside the subclass could call it.

Would that fulfill your needs, or are you really looking for type-based access control?

Brent Royal-Gordon

More information about the swift-evolution mailing list