swiftlang / swift

The Swift Programming Language
https://swift.org
Apache License 2.0
67.49k stars 10.35k forks source link

[SR-117] Calling default implementation of protocols #42739

Open swift-ci opened 8 years ago

swift-ci commented 8 years ago
Previous ID SR-117
Radar None
Original Reporter cojoj (JIRA User)
Type Improvement
Additional Detail from JIRA | | | |------------------|-----------------| |Votes | 0 | |Component/s | Compiler | |Labels | Improvement | |Assignee | None | |Priority | Medium | md5: 222f3e1dbdbb54005302e8c206e80dfb

relates to:

Issue Description:

If you define a simple protocol like:

protocol Foo {
    func testPrint()
}

And than you provide a default implementation for testPrint() method in protocol extensions like:

extension Foo {
    func testPrint() {
        print("Protocol extension call")
    }
}

You aren't allowed to call the fault implementation from the structure eg.

struct Bar: Foo {
    func testPrint() {
        self.testPrint()
        print("Call from struct")
    }
}

This is some sort of limitation as often happens that a default implementation is providing a major part of implementation and only one, simple line is changed in actual struct implementation. If you're using classes you can achieve this by creating a base class and calling a method on super. If you consider structs, there's no such possibility and you always have to write a whole implementation from scratch in each structure which conforms to the protocol.


You can use composition by creating nested structure, but it's neither logical nor clean... It's rather a hack...

struct Bar: Foo {
    func testPrint() {
        // Calling default implementation
        struct Dummy : Foo {}
        let dummy = Dummy()
        dummy.testPrint()
        print("Call from struct")
    }
}
belkadan commented 8 years ago

As a language change, this should go through the Swift Evolution Process.

swift-ci commented 8 years ago

Comment by Mateusz Zając (JIRA)

@belkadan would you rather see it as a PR to https://github.com/apple/swift-evolution repo?

swift-ci commented 8 years ago

Comment by Radek Pietruszewski (JIRA)

cojoj (JIRA User) You should start a discussion on the Evolution mailing list first before submitting a PR

swift-ci commented 7 years ago

Comment by Brian (JIRA)

You can do `(self as Foo).testPrint()` to invoke the default method. Not the most elegant or discoverable syntax, but.

typesanitizer commented 3 years ago

Related discussion for enums: https://forums.swift.org/t/super-description-for-enums/49174