I think we should beef up protocols a little bit so that they can serve the role of abstract classes. That would make for a nice, clean separation: anything abstract is a protocol, while anything concrete is a class (or struct or enum).
What would protocols need in order to support everything abstract classes can do? First, we'd probably need to extend class constraints to allow a protocol to require you to subclass a given base class:
// Hypothetical replacement for UIControl.
protocol UIControl: UIView {
func sendAction(_ action: Selector, to target: Any?, for event: UIEvent)
}
extension UIControl {
func sendAction(_ action: Selector, to target: Any?, for event: UIEvent) {
UIApplication.shared.sendAction(action, to: target, from: self, for: event)
}
}
Maybe allow them to declare automatically-added storage, perhaps even private to the protocol:
protocol UIControl: UIView {
@automatic
private var actions: [UIControlEvents: [(target: Any?, action: Selector)]] = [:]
func sendAction(_ action: Selector, to target: Any?, for event: UIEvent)
}
extension UIControl {
func sendActions(for controlEvents: UIControlEvents) {
for (event, pairs) in actions where event.contains(controlEvents) {
for pair in pairs {
sendAction(pair.action, to: pair.target, for: UIApplication.shared.currentEvent)
}
}
}
func sendAction(_ action: Selector, to target: Any?, for event: UIEvent) {
UIApplication.shared.sendAction(action, to: target, from: self, for: event)
}
}
Probably something like `super` for when you want to override a default implementation but still call it:
class MyButton: UIControl {
func sendAction(_ action: Selector, to target: Any?, for event: UIEvent) {
print("Sending \(action) to \(target)")
super(UIControl).sendAction(action, to: target, for: event)
}
}
These are all solid features that would be great additions to protocols, even when they're *not* replacing abstract classes.
···
On Nov 2, 2017, at 1:57 PM, Taylor Swift via swift-evolution <swift-evolution@swift.org> wrote:
Swift architectures use much less inheritance (and class types) in general than equivalent c++ architectures. personally i have never been in a situation where i didn’t need a pure abstract method that was better declared as a protocol requirement.
--
Brent Royal-Gordon
Architechies