> On Nov 2, 2017, at 1:57 PM, Taylor Swift via swift-evolution
> <[email protected]> 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.
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.
--
Brent Royal-Gordon
Architechies
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution