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
。