[swift-evolution] Proposal: Universal dynamic dispatch for method calls

Gwendal Roué gwendal.roue at gmail.com
Wed Dec 9 13:01:01 CST 2015

> Le 9 déc. 2015 à 19:52, Kevin Ballard via swift-evolution <swift-evolution at swift.org> a écrit :
> b) methods defined in protocol extensions by definition can't be overridden already,

Methods defined in protocol extension actually can, sort of, be overridden, and this is very useful:

    protocol P { }
    extension P {
        func f() { … }
    struct S {
        func f() {
            (self as P).f()

I know only one use case for this technique, in the groue/GRDB.swift SQLite wrapper:

In this library, a DatabasePersistable protocol provides basic CRUD operations, and a Record class adopts this protocol and "overrides" with the technique above the protocol methods with extra features provided by the class (especially change tracking).

The benefits of this architecture are:

- You can subclass use the full-featured Record base class, and get CRUD + change tracking for free.
- The Record subclasses can override the CRUD methods, and add custom code (validation, for example).
- You can have a custom struct adopt DatabasePersistable, and get CRUD for free.
- The custom structs that can also "override" the CRUD methods, and add custom code (validation, for example).

This is, in my opinion, a very valid use case for this "overriding".
Gwendal Roué
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151209/e08b471f/attachment.html>

More information about the swift-evolution mailing list