将关联类型限制为通用类

时间:2019-04-02 19:24:53

标签: swift inheritance protocols

我正在尝试创建具有关联类型的协议,该协议具有一个初始化程序,该初始化程序将符合该协议的类作为其自变量类型。本身可以正常工作:

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以外的类实现的。

1 个答案:

答案 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取一个其他名字。