【问题标题】:Swift - Can I achieve mutual generics reference to classes?Swift - 我可以实现对类的相互泛型引用吗?
【发布时间】:2017-09-01 08:08:11
【问题描述】:

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

BaseController <> BaseView

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

LoginController <> LoginView.

BaseController 对其类型为 &lt;T : BaseView&gt; 的视图具有强引用,BaseView 应对其类型为 &lt;T: BaseController&gt; 的控制器进行弱引用

我已经设法获得了 BaseView 的泛型:

  class BaseController <T: BaseScreen>

所以我这样做:

 class LoginController : BaseController<LoginView> 

这可行,并且控制器可以直接访问(可见性)视图函数,我不需要每次都进行强制转换。

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

 class BaseView <T : BaseController>

然后编译器强迫我这样做

class BaseView <T : BaseController <BaseScreen>> 

这会导致递归错误。

有没有一种方法可以使用泛型进行交叉引用?现在我坚持将视图简单地转换为控制器以防万一。

【问题讨论】:

    标签: swift generics nested-generics


    【解决方案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
        ...
    }
    

    【讨论】:

    • 太棒了!我仍然需要超类,因为它有一些方法实现,但我想我也可以协议
    • 您仍然可以使用基类并仅将协议用于特定类型的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多