I'm not sure wether the review period is actually over (or better say "turned 
into an internal discussion", as I haven't seen a result yet ;-), but as nobody 
jumped onto the "something more holistic"-train, I used my free time at the 
lake for some thinking…

There are three degrees of freedom, which makes it hard to create a complete 
table, but in essence, we are talking about this matrix:

Subclassing allowed     Subclassing forbidden
Instantiation allowed   open (public)   final (public final)
Instantiation forbidden abstract        internal

As we have two* choices for each aspect, we have four keywords — no matter if 
we give each combination its own name, or build combinations of them.
I think combinations are less appealing, because there are already established 
terms for all cells, but your milage may vary.
Swift currently has no clean separation of the concepts, so "final" is actually 
"public final".
The matrix contains "abstract", and if you put the preoccupation of "everything 
should be done with protocols!" away, I guess you'll recognize the beauty of 
symmetry which is disturbed because one modifier is missing (I guess no one 
argues that we need something like abstract — it is just about how it can be 
expressed).

This simple table could be everything that is needed… if Swift had only a 
separation between modules (and as it has been decided to increase the number 
of levels, that simplification doesn't seem realistic).

So, we have an impressive number of four access levels, and it starts getting 
complicated to deal with 16 different keywords… but there is already a 
well-known alternative to model access rights based on the status of the 
accessor:
File rights in UNIX.
This system can be operated in a way that I wouldn't recommend for a 
programming language ("func 755 foo()" anyone?), but also in a more explicit 
form ("group=rwx"…).
The second variant could be adopted for Swift, and that is where it's getting 
really complicated, because syntax like "module=subclass, public+call func 
foo()" most likely isn't "swifty" as well… 

None the less, this model would bring true orthogonality, and establish a clean 
separation of concerns.

- Tino

* properties left aside
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to