> 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

Reply via email to