我们可以制作如下的生成协议:
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?
}
但是,这不是我想要的,它会导致我的委托不能继承其他父类
答案 0 :(得分:1)
您可以使用泛型,使用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>()
答案 1 :(得分:0)
您可以通过几种方法解决此错误。
protocol SomeDelegate {
typealias T
func xxx(x: T)
}
首先为函数使用正确的类型类,编译器会推断出类型本身。
class AA: SomeDelegate {
func xxx(x: Int) {
println(x)
}
}
或者,您也可以覆盖类型并为其指定正确的类型类,如
class AA: SomeDelegate {
typealias T = Int
func xxx(x: T) {
println(x)
}
}
然后就像你做的那样使用它,
class B {
var someDelegate: AA?
}