Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift-我可以实现对类的相互泛型引用吗?_Swift_Generics_Nested Generics - Fatal编程技术网

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

Swift-我可以实现对类的相互泛型引用吗?,swift,generics,nested-generics,Swift,Generics,Nested Generics,我想要两个绑定的类。这意味着,两个类都知道彼此的方法 BaseController <> BaseView 因此,我: class LoginController : BaseController<LoginView> 类登录控制器:BaseController 这是可行的,控制器可以直接访问视图函数(可见性),我不需要每次都强制转换 但是我不能在视图上做同样的事情,因为如果我做了 class BaseView <T : BaseController&g

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

BaseController <> BaseView
因此,我:

 class LoginController : BaseController<LoginView> 
类登录控制器:BaseController
这是可行的,控制器可以直接访问视图函数(可见性),我不需要每次都强制转换

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

 class BaseView <T : BaseController>
类基本视图
然后,编译器强制我这样做

class BaseView <T : BaseController <BaseScreen>> 
类基本视图
这会导致递归错误


有没有一种方法可以使用泛型进行交叉引用?现在我坚持认为只要在需要时将视图强制转换到控制器上即可。

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

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

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

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

伟大的我仍然需要超类,因为它有一些方法实现,但我认为我也可以使用协议。你也可以使用基类,只对特定类型的东西使用协议。
class BaseView <T : BaseController <BaseScreen>> 
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
    ...
}