我们可以产生这样后续的协议:

protocol SomeDelegate {
    typealias T
    func xxx(x: T)
}


并使一些类符合它:

class AA: SomeDelegate {
    typealias T = Int
    func xxx(x: T) {
        // do some thing
    }
}


我的问题是如何声明某些属性符合生成协议,如下所示:

class BB {
    var delegate: SomeDelegate
}


上面的代码将引发错误:

Protocol 'SomeDelegate' can only be used as a generic constraint
because it has Self or associated type requirements


看来我可以将协议用作委托,如下所示:

class BB {
    var delegate: AA?
}


但是,这不是我想要的,这将导致我的委托无法继承其他父类

最佳答案

您可以使用泛型,将SomeDelegate用作类型约束:

class BB <U : SomeDelegate> {
   var delegate: U? = nil
}


这样,您只需在初始化U的实例时提供BB的类型:

struct MyStruct : SomeDelegate {
    // The argument of xxx needs to be a concrete type here.
    func xxx(x: Int) {
        // ...
    }
}

let bb = BB<MyStruct>()

10-07 22:32