Swift - 我可以实现对类的相互泛型引用吗?

时间:2017-08-31 23:34:06

标签: swift generics nested-generics

我想要绑定两个类。这意味着,两个类都知道彼此的方法。

BaseController <> BaseView

这些类用于声明子类,例如

LoginController <> LoginView.

BaseController强烈提及其对<T : BaseView>种类的看法,BaseView应该对其类型的控制器<T: BaseController>

进行弱引用

我设法使用BaseView的通用:

  class BaseController <T: BaseScreen>

所以我这样做:

 class LoginController : BaseController<LoginView> 

有效且控制器可以直接访问(可见性)视图功能,我不需要每次都进行转换。

但是我不能在View上做同样的事情,因为如果我这样做

 class BaseView <T : BaseController>

然后编译器强迫我做

class BaseView <T : BaseController <BaseScreen>> 

导致递归错误。

有没有办法可以使用泛型进行交叉引用?现在我正在坚持视图,只需在需要的时候转向控制器。

1 个答案:

答案 0 :(得分:1)

您可以使用协议和关联类型而不是基类(并在协议扩展中实现基类型的方法):

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

实现其中一个协议的类必须为所需的相关类指定一个类型:

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

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