如何将生成协议声明为委托?

how to declare a generate protocol as delegate?

我们可以生成如下协议:

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

并使一些 class 符合它:

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?
}

但是,这不是我想要的,它会导致我的委托无法继承其他父级 class

您可以通过几种方法解决此错误。

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

首先为函数使用正确的类型 class,编译器会自行推断类型。

 class AA: SomeDelegate {
    func xxx(x: Int) {
        println(x)
    }
   }

或者,您也可以覆盖类型别名并为其分配适当的类型 class,例如,

class AA: SomeDelegate {
    typealias T = Int
    func xxx(x: T) {
        println(x)
    }
}

然后像你做的那样使用它,

class B {
    var someDelegate: AA?
}

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

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

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

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

let bb = BB<MyStruct>()