2017-08-31 9 views
0

私はバインドされている2つのクラスを持っていると思います。これは、両方のクラスが互いのメソッドについて知っていることを意味します。スウィフト - クラスに対する相互ジェネリックリファレンスを得ることはできますか?

BaseController <> BaseView 

これらのクラスは、例えば

LoginController <> LoginView. 

BaseControllerは一種<T : BaseView>のビューへの強い参照を有し、サブクラスを宣言するために使用され、BaseViewは一種<T: BaseController>

そのコントローラへの弱参照を持つべきです

私はBaseViewにジェネリックを持っています:

class BaseController <T: BaseScreen> 

私がそうすることを:

動作し、コントローラは、ビュー機能に直接アクセス(可視性)を持って、私はすべての時間をキャストする必要はありません
class LoginController : BaseController<LoginView> 

。私は

class BaseView <T : BaseController> 

を行う場合、コンパイラは再帰エラーになり

class BaseView <T : BaseController <BaseScreen>> 

を行うために私を強制するため

は、しかし、私は、ビュー上で同じことを行うことはできません。

ジェネリックを使用してその相互参照を行う方法はありますか?今のところ、必要に応じてコントローラにキャストするだけの視点に固執しています。

答えて

1
かわりに、ベースクラスのプロトコルおよび関連タイプを使用(およびプロトコルの拡張でベース型のメソッドを実装する)ことができ

protocol ControllerProtocol: class { 
    associatedtype View: ViewProtocol 
    var view: View { get } 
} 
protocol ViewProtocol: class { 
    associatedtype Controller: ControllerProtocol 
    weak var controller: Controller { get } 
} 

プロトコルのいずれかにtypealiasを指定しなければならない実装クラス希望する関連クラス:

class LoginController: ControllerProtocol { 
    typealias View = LoginView 
    var view: LoginView 
    ... 
} 

class LoginView: ViewProtocol { 
    typealias Controller = LoginController 
    weak var controller: LoginController 
    ... 
} 
+0

素晴らしい!いくつかのメソッドの実装があるので、私はまだスーパークラスが必要ですが、私はプロトコルもできると思います。 – htafoya

+0

また、基本クラスを使用し、型固有のものに対してのみプロトコルを使用することもできます。 – Palle

関連する問題