无法在受其他协议限制的泛型类型上调用协议方法
Can't invoke protocol method on generic type restricted by other protocol
我有以下内容:
protocol Guard {
var prisoners: Array<Prisoner>? { get set }
func smack<T: Prisoner>(prisoner: T)
func smackAll()
}
extension Guard {
final func smackAll() {
prisoners?.forEach() { smack([=10=]) }
//ERROR: "Cannot invoke 'smack' with an argument list of type '(Prisoner)'"
}
}
protocol Prisoner {
var guards: Array<Guard>? { get set }
}
extension Prisoner {
final func incurBeating() {
guards?.forEach() { [=10=].smack(self) }
}
}
我希望将 Guard
协议分配给任意数量的不同 class 类型的对象,并 Prisoner
分配给其他对象。根据它们的 class 类型,充当守卫的对象将有自己的 smack 实现。但我认为没有理由在每个可能继承 Guard
的 class 中重写 smackAll
。所以我试着这样做,但编译器不允许我这么做。我错过了什么?
以下似乎对我有用。
protocol Guard {
var prisoners: Array<Prisoner>? { get set }
func smack<Prisoner>(prisoner: Prisoner)
func smackAll()
}
extension Guard {
func smackAll() {
prisoners?.forEach() { smack([=10=]) }
//ERROR: "Cannot invoke 'smack' with an argument list of type '(Prisoner)'"
}
}
protocol Prisoner {
var guards: Array<Guard>? { get set }
}
注意:func smack(prisoner: Prisoner) 你不需要使用 T: Prisoner。它已经是一个接口并且可以引用该接口,它不会让你把任何不是 Prisoner 实现者的东西放在那里。您唯一会使用它的情况是向具体的 class 添加更多约束,例如 T: Where MyConcrete implements Prisoner
我有以下内容:
protocol Guard {
var prisoners: Array<Prisoner>? { get set }
func smack<T: Prisoner>(prisoner: T)
func smackAll()
}
extension Guard {
final func smackAll() {
prisoners?.forEach() { smack([=10=]) }
//ERROR: "Cannot invoke 'smack' with an argument list of type '(Prisoner)'"
}
}
protocol Prisoner {
var guards: Array<Guard>? { get set }
}
extension Prisoner {
final func incurBeating() {
guards?.forEach() { [=10=].smack(self) }
}
}
我希望将 Guard
协议分配给任意数量的不同 class 类型的对象,并 Prisoner
分配给其他对象。根据它们的 class 类型,充当守卫的对象将有自己的 smack 实现。但我认为没有理由在每个可能继承 Guard
的 class 中重写 smackAll
。所以我试着这样做,但编译器不允许我这么做。我错过了什么?
以下似乎对我有用。
protocol Guard {
var prisoners: Array<Prisoner>? { get set }
func smack<Prisoner>(prisoner: Prisoner)
func smackAll()
}
extension Guard {
func smackAll() {
prisoners?.forEach() { smack([=10=]) }
//ERROR: "Cannot invoke 'smack' with an argument list of type '(Prisoner)'"
}
}
protocol Prisoner {
var guards: Array<Guard>? { get set }
}
注意:func smack(prisoner: Prisoner) 你不需要使用 T: Prisoner。它已经是一个接口并且可以引用该接口,它不会让你把任何不是 Prisoner 实现者的东西放在那里。您唯一会使用它的情况是向具体的 class 添加更多约束,例如 T: Where MyConcrete implements Prisoner