Swift Init要求类型T<;U>;和X:T<;U>;相等

Swift Init要求类型T<;U>;和X:T<;U>;相等,swift,generics,type-erasure,Swift,Generics,Type Erasure,一年来,我一直被类似的问题困扰着。很抱歉,没有一个例子,我不知道如何解释这个问题 问题的核心是:T和X:T并不等同。我想将存储的属性添加到X,因此仅仅使用T和扩展是不够的 我在类型擦除委托的上下文中执行此操作。如果你对如何提高这个帖子的标题有任何建议,请让我知道。 如何解决此问题 基本类型: protocol RouterDelegate: class { associatedtype RT: Routing associatedtype R: Router<RT>

一年来,我一直被类似的问题困扰着。很抱歉,没有一个例子,我不知道如何解释这个问题

问题的核心是:
T
X:T
并不等同。我想将存储的属性添加到
X
,因此仅仅使用
T
和扩展是不够的

我在类型擦除委托的上下文中执行此操作。如果你对如何提高这个帖子的标题有任何建议,请让我知道。 如何解决此问题

基本类型:

protocol RouterDelegate: class {
    associatedtype RT: Routing
    associatedtype R: Router<RT>
    func routerDidSomething(_ router: R)
}

protocol Routing {}

class Router<RT: Routing> {
    var delegate: AnyRouterDelegate<Router<RT>, RT>?
}
protocolrouterdelegate:class{
关联类型RT:路由
关联类型R:路由器
func routerDidSomething(uRouter:R)
}
协议路由{}
类路由器{
var代表:AnyRouterDelegate?
}
在委托周围键入已擦除的包装:

fileprivate class AnyRouterDelegateBase<R: Router<RT>, RT>: RouterDelegate {
    func routerDidSomething(_ router: R) { }
}

fileprivate final class AnyRouterDelegateBox<D: RouterDelegate>: AnyRouterDelegateBase<D.R, D.RT> {
    weak var delegate: D?
    
    init(_ delegate: D) {
        self.delegate = delegate
    }
    override func routerDidSomething(_ router: R) {
        self.delegate?.routerDidSomething(router)
    }
}

final class AnyRouterDelegate<R: Router<RT>, RT>: RouterDelegate {
    
    private let base: AnyRouterDelegateBase<R, RT>
    
    init<D: RouterDelegate>(_ delegate: D) where D.R == R, D.RT == RT {
        self.base = AnyRouterDelegateBox(delegate)
    }
    
    func routerDidSomething(_ router: R) {
        self.base.routerDidSomething(router)
    }
    
}
fileprivate类AnyRouterDelegateBase:RouterDelegate{
func routerDidSomething(router:R){}
}
fileprivate最终类AnyRouterDelegateBox:AnyRouterDelegateBase{
弱var委托:D?
初始化(uu委托:D){
self.delegate=委托
}
重写func routerDidSomething(router:R){
self.delegate?.routerDidSomething(路由器)
}
}
最终类AnyRouterDelegate:RouterDelegate{
私人出租基地:AnyRouterDelegateBase
init(u-delegate:D),其中D.R==R,D.RT==RT{
self.base=AnyRouterDelegateBox(委托)
}
func routerDidSomething(uRouter:R){
self.base.routerDidSomething(路由器)
}
}
具体实现/子类

struct PortRouting: Routing { }
final class PortRouter: Router<PortRouting> { }
protocol PortRouterDelegate: RouterDelegate where R == PortRouter, RT == PortRouting { }
struct PortRouting:路由{}
最后一个类PortRouter:路由器{}
协议PortRouterDelegate:RouterDelegate,其中R==PortRouter,RT==PortRouting{}
使用

类控制器:PortRouterDelegate{
let router=PortRouter()
init(){
self.router.delegate=AnyRouterDelegate(self)
//***错误:-初始值设定项“init(:)”要求“Router”和“PortRouter”类型等效
}
func routerDidSomething(router:PortRouter){}
}

删除了冗余约束:

protocol RouterDelegate: class {
    associatedtype RT: Routing
    typealias R = Router<RT>
    func routerDidSomething(_ router: R)
}

protocol Routing {}

class Router<RT: Routing> {
    var delegate: AnyRouterDelegate<RT>?
}

fileprivate class AnyRouterDelegateBase<RT: Routing>: RouterDelegate {
    func routerDidSomething(_ router: R) { }
}

fileprivate final class AnyRouterDelegateBox<D: RouterDelegate>: AnyRouterDelegateBase<D.RT> {
    weak var delegate: D?
    
    init(_ delegate: D) {
        self.delegate = delegate
    }
    override func routerDidSomething(_ router: R) {
        self.delegate?.routerDidSomething(router)
    }
}

final class AnyRouterDelegate<RT: Routing>: RouterDelegate {
    private let base: AnyRouterDelegateBase<RT>
    
    init<D: RouterDelegate>(_ delegate: D) where D.RT == RT {
        self.base = AnyRouterDelegateBox(delegate)
    }
    
    func routerDidSomething(_ router: R) {
        self.base.routerDidSomething(router)
    }
    
}

struct PortRouting: Routing { }
final class PortRouter: Router<PortRouting> { }
protocol PortRouterDelegate: RouterDelegate where RT == PortRouting {
    
}

class Controller: PortRouterDelegate {
    
    let router: Router<PortRouting> = PortRouter()
    
    init() {
        self.router.delegate = AnyRouterDelegate(self)
        
    }
    
    func routerDidSomething(_ router: Router<PortRouting>) { }
}
protocolrouterdelegate:class{
关联类型RT:路由
typealias R=路由器
func routerDidSomething(uRouter:R)
}
协议路由{}
类路由器{
var代表:AnyRouterDelegate?
}
fileprivate类AnyRouterDelegateBase:RouterDelegate{
func routerDidSomething(router:R){}
}
fileprivate最终类AnyRouterDelegateBox:AnyRouterDelegateBase{
弱var委托:D?
初始化(uu委托:D){
self.delegate=委托
}
重写func routerDidSomething(router:R){
self.delegate?.routerDidSomething(路由器)
}
}
最终类AnyRouterDelegate:RouterDelegate{
私人出租基地:AnyRouterDelegateBase
init(u-delegate:D),其中D.RT==RT{
self.base=AnyRouterDelegateBox(委托)
}
func routerDidSomething(uRouter:R){
self.base.routerDidSomething(路由器)
}
}
结构端口路由:路由{}
最后一个类PortRouter:路由器{}
协议PortRouterDelegate:RouterDelegate,其中RT==PortRouting{
}
类控制器:PortRouterDelegate{
let路由器:路由器=端口路由器()
init(){
self.router.delegate=AnyRouterDelegate(self)
}
func routerDidSomething(urouter:router){}
}

删除了冗余约束:

protocol RouterDelegate: class {
    associatedtype RT: Routing
    typealias R = Router<RT>
    func routerDidSomething(_ router: R)
}

protocol Routing {}

class Router<RT: Routing> {
    var delegate: AnyRouterDelegate<RT>?
}

fileprivate class AnyRouterDelegateBase<RT: Routing>: RouterDelegate {
    func routerDidSomething(_ router: R) { }
}

fileprivate final class AnyRouterDelegateBox<D: RouterDelegate>: AnyRouterDelegateBase<D.RT> {
    weak var delegate: D?
    
    init(_ delegate: D) {
        self.delegate = delegate
    }
    override func routerDidSomething(_ router: R) {
        self.delegate?.routerDidSomething(router)
    }
}

final class AnyRouterDelegate<RT: Routing>: RouterDelegate {
    private let base: AnyRouterDelegateBase<RT>
    
    init<D: RouterDelegate>(_ delegate: D) where D.RT == RT {
        self.base = AnyRouterDelegateBox(delegate)
    }
    
    func routerDidSomething(_ router: R) {
        self.base.routerDidSomething(router)
    }
    
}

struct PortRouting: Routing { }
final class PortRouter: Router<PortRouting> { }
protocol PortRouterDelegate: RouterDelegate where RT == PortRouting {
    
}

class Controller: PortRouterDelegate {
    
    let router: Router<PortRouting> = PortRouter()
    
    init() {
        self.router.delegate = AnyRouterDelegate(self)
        
    }
    
    func routerDidSomething(_ router: Router<PortRouting>) { }
}
protocolrouterdelegate:class{
关联类型RT:路由
typealias R=路由器
func routerDidSomething(uRouter:R)
}
协议路由{}
类路由器{
var代表:AnyRouterDelegate?
}
fileprivate类AnyRouterDelegateBase:RouterDelegate{
func routerDidSomething(router:R){}
}
fileprivate最终类AnyRouterDelegateBox:AnyRouterDelegateBase{
弱var委托:D?
初始化(uu委托:D){
self.delegate=委托
}
重写func routerDidSomething(router:R){
self.delegate?.routerDidSomething(路由器)
}
}
最终类AnyRouterDelegate:RouterDelegate{
私人出租基地:AnyRouterDelegateBase
init(u-delegate:D),其中D.RT==RT{
self.base=AnyRouterDelegateBox(委托)
}
func routerDidSomething(uRouter:R){
self.base.routerDidSomething(路由器)
}
}
结构端口路由:路由{}
最后一个类PortRouter:路由器{}
协议PortRouterDelegate:RouterDelegate,其中RT==PortRouting{
}
类控制器:PortRouterDelegate{
let路由器:路由器=端口路由器()
init(){
self.router.delegate=AnyRouterDelegate(self)
}
func routerDidSomething(urouter:router){}
}

唯一的问题是,在
routerddomething(:)
中,我需要
PortRouter
而不是
Router
,因为
PortRouter
具有唯一的属性。我认为我仍然需要将
R
定义为
路由器
的关联类型。但是我可以通过添加
来解决这个问题,其中RT==PortRouting,R==PortRouter
。唯一的问题是在
routerDidSomething(:)
中,我需要
PortRouter
而不是
Router
,因为
PortRouter
具有独特的属性。我认为我仍然需要将
R
定义为
路由器
的关联类型。但是我可以通过添加
来解决这个问题,其中RT==PortRouting,R==PortRouter