// RUN: not %target-swift-frontend %s -typecheck public protocol TiView { } public class TiPresenter { private var view: V? = nil public func create() { } public func attchView(view: V) { self.view = view } public func detachView() { self.view = nil } public func destroy() { } } public class TiViewController, V: TiView> /*: UiViewController*/ // should extend UiViewController but this is not problem here { lazy var presenter: P = { return self.providePresenter() }() public init() { presenter.create() } func providePresenter() -> P { fatalError("must override") } func provideView() -> V { if (self is V) { return self as! V } else { fatalError("UIViewController doesn't implement TiView interface") } } } protocol MyView: TiView { func setDataItems(_: [String]) } class MyPresenter: TiPresenter { //ERROR: Using 'MyView' as a concrete type conforming to protocol 'TiView' is not supported } class MyController: TiViewController, MyView { // ERROR: 'TiViewController' requires that 'MyPresenter' inherit from 'TiPresenter' override func providePresenter() -> MyPresenter { return MyPresenter() } internal func setDataItems(_: [String]) { //TODO } } let vc = MyController() let p = vc.presenter class TestView: MyView { internal func setDataItems(_: [String]) { // TODO } } let view = TestView() p.attchView(view: view)