Я создаю несколько классов NSView
, все из которых поддерживают специальную операцию, которую мы назовем transmogrify
. На первый взгляд это кажется идеальным местом для протокола:
protocol TransmogrifiableView {
func transmogrify()
}
Однако этот протокол не гарантирует, что каждый TransmogrifiableView
должен быть NSView
. Это означает, что любые методы NSView
, которые я вызываю на TransmogrifiableView
, не будут проверять:
let myView: TransmogrifiableView = getTransmogrifiableView()
let theSuperView = myView.superView // error: TransmogrifiableView does not have a property called 'superview'
Я не знаю, как требовать, чтобы все классы, реализующие мой протокол, также были подклассами NSView
. Я пробовал это:
protocol TransmogrifiableView: NSView {
func transmogrify()
}
но Swift жалуется, что протоколы не могут наследовать от классов. Это не помогает превратить протокол в протокол только для классов, используя
protocol TransmogrifiableView: class, NSView {
func transmogrify()
}
Я не могу сделать TransmogrifiableView
суперкласс, а не протокол, потому что некоторые из моих классов TransmogrifiableView
должны быть подклассами других, непередаваемых изображений.
Как мне потребовать, чтобы все TransmogrifiableView
также были NSView
? Я действительно не хочу перенести свой код с помощью "as
" конверсий, которые являются плохими и отвлекающими.