我正在尝试创建具有关联类型的协议,该协议具有一个初始化程序,该初始化程序将符合该协议的类作为其自变量类型。本身可以正常工作:
protocol A {
associatedtype B: C where C.InitializableBy == Self
}
protocol C {
associatedtype InitializableBy
init(arg: InitializableBy)
}
但是,由于我不想为每个类编写一个新的初始化程序,因此我希望B
的类型约束是一个类。我已经尝试过这种方法:
protocol A {
associatedtype B: D<Self>
}
class D<T> {
init(arg: T) { ... }
}
但是这不起作用,或者至少我不能使这种方式的类符合协议。使它起作用的唯一方法是同时使用类和协议:
protocol A {
associatedtype B: C where C.InitializableBy == Self
}
protocol C {
associatedtype InitializableBy
init(arg: InitializableBy)
}
class D<T> : C {
typealias InitializableBy = T
init(arg: T) { ... }
}
这样,一个类可以通过实现A
的嵌套类型而符合D
,而不必重新定义初始化程序:
class Test: A {
class B: D<Test> {}
}
但是我想绕过使用“虚拟协议” C
,因为它不是由D
以外的类实现的。
答案 0 :(得分:0)
这就是您所需要的。
protocol A {
associatedtype B = D<Self>
}
class D<T> {
init(arg: T) {}
}
或
protocol A {
typealias B = D<Self>
}
class D<T> {
init(arg: T) {}
}
您的代码无法正常运行的原因是:
的意思是“符合”,而不是“是”。除非我弄错,否则您只是想给D取一个其他名字。