I'm creating several NSView classes, all of which support a special operation, which we'll call transmogrify. At first glance, this seems like the perfect place for a protocol:
protocol TransmogrifiableView { func transmogrify() } However, this protocol does not enforce that every TransmogrifiableView be an NSView as well. This means that any NSView methods I call on a TransmogrifiableView will not type check:
let myView: TransmogrifiableView = getTransmogrifiableView() let theSuperView = myView.superView // error: TransmogrifiableView does not have a property called 'superview' I don't know how to require that all classes implementing my protocol are also subclasses of NSView. I tried this:
protocol TransmogrifiableView: NSView { func transmogrify() } but Swift complains that protocols cannot inherit from classes. It does not help to turn the protocol into a class-only protocol using
protocol TransmogrifiableView: class, NSView { func transmogrify() } I cannot make TransmogrifiableView a superclass rather than a protocol, because some of my TransmogrifiableView classes must be subclasses of other, non-transmogrifiable views.
How should I require that all TransmogrifiableView's also be NSView's? I really don't want to pepper my code with "as" conversions, which are bad form and distracting.
guard let r = delegate as? UIResponder ...I didn't find it too distracting. Great question, I was wondering same.