<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">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…<div class=""><br class=""></div><div class="">There are three degrees of freedom, which makes it hard to create a complete table, but in essence, we are talking about this matrix:<br class=""><div class=""><br class=""></div><div class=""><table style="-webkit-print-color-adjust: exact; margin-right: 0px; margin-left: 0px; padding: 0px; border-collapse: collapse; color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; background-color: rgb(255, 255, 255); margin-top: 0px !important; margin-bottom: 0px !important;" class=""><thead style="-webkit-print-color-adjust: exact;" class=""><tr style="-webkit-print-color-adjust: exact; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(204, 204, 204); margin: 0px; padding: 0px;" class=""><th style="-webkit-print-color-adjust: exact; border: 1px solid rgb(204, 204, 204); margin: 0px; padding: 6px 13px;" class=""></th><th style="-webkit-print-color-adjust: exact; border: 1px solid rgb(204, 204, 204); margin: 0px; padding: 6px 13px;" class="">Subclassing allowed</th><th style="-webkit-print-color-adjust: exact; border: 1px solid rgb(204, 204, 204); margin: 0px; padding: 6px 13px;" class="">Subclassing forbidden</th></tr></thead><tbody style="-webkit-print-color-adjust: exact;" class=""><tr style="-webkit-print-color-adjust: exact; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(204, 204, 204); margin: 0px; padding: 0px;" class=""><td style="-webkit-print-color-adjust: exact; border: 1px solid rgb(204, 204, 204); margin: 0px; padding: 6px 13px;" class="">Instantiation allowed</td><td style="-webkit-print-color-adjust: exact; border: 1px solid rgb(204, 204, 204); margin: 0px; padding: 6px 13px;" class="">open (public)</td><td style="-webkit-print-color-adjust: exact; border: 1px solid rgb(204, 204, 204); margin: 0px; padding: 6px 13px;" class="">final (public final)</td></tr><tr style="-webkit-print-color-adjust: exact; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(204, 204, 204); background-color: rgb(248, 248, 248); margin: 0px; padding: 0px;" class=""><td style="-webkit-print-color-adjust: exact; border: 1px solid rgb(204, 204, 204); margin: 0px; padding: 6px 13px;" class="">Instantiation forbidden</td><td style="-webkit-print-color-adjust: exact; border: 1px solid rgb(204, 204, 204); margin: 0px; padding: 6px 13px;" class="">abstract</td><td style="-webkit-print-color-adjust: exact; border: 1px solid rgb(204, 204, 204); margin: 0px; padding: 6px 13px;" class="">internal</td></tr></tbody></table><div class=""><br class=""></div></div></div><div class="">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.</div><div class="">I think combinations are less appealing, because there are already established terms for all cells, but your milage may vary.</div><div class="">Swift currently has no clean separation of the concepts, so "final" is actually "public final".</div><div class="">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).</div><div class=""><br class=""></div><div class="">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).</div><div class=""><br class=""></div><div class="">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:</div><div class="">File rights in UNIX.</div><div class="">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"…).</div><div class="">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… </div><div class=""><br class=""></div><div class="">None the less, this model would bring true orthogonality, and establish a clean separation of concerns.</div><div class=""><br class=""></div><div class="">- Tino</div><div class=""><br class=""></div><div class="">* properties left aside</div></body></html>