Remove final support in protocol extensions
- Proposal: SE-0164
- Author: Brian King
- Review Manager: Doug Gregor
- Status: Implemented (Swift 4)
- Decision Notes: Rationale
- Bug: SR-1762
This proposal disallows the
final keyword when declaring functions in protocol
Discussion took place on the Swift Evolution mailing list in the Remove support for final in protocol extensions thread.
In the current version of Swift, the
final keyword does not modify
dispatch behavior in any way, and it does not generate an error message.
This keyword has no use in Swift's current protocol model. Functions in
protocol extensions cannot be overridden and will always use direct dispatch.
Jordan Rose described the history behind this behavior:
We originally required `final` to signify that there was no dynamic dispatch going on. Once we started allowing protocol extension methods to fulfill requirements, it became more confusing than useful.
If adopted, the compiler will flag the use of the
final keyword on functions
declared within a protocol extension, and emit an error or warning. This
behavior is consistent with
final use in structures and enumerations.
This change will impact source compatibility. Existing use of
protocol extensions will raise a compilation error. The compiler will address
this by source migration and fixits. When running in Swift 3 mode, a warning
will be generated instead of an error.
Effect on ABI stability
This proposal does not affect ABI stability.
Effect on API resilience
This proposal does not affect API resilience.
There are no alternatives considered at this time.