如何将生成协议声明为委托?
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>()
我们可以生成如下协议:
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>()