我有以下内容:
protocol Guard {
var prisoners: Array<Prisoner>? { get set }
func smack<T: Prisoner>(prisoner: T)
func smackAll()
}
extension Guard {
final func smackAll() {
prisoners?.forEach() { smack($0) }
//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() { $0.smack(self) }
}
}
我希望将Guard
协议分配给任意数量的不同类类型的对象,以及Prisoner
其他对象。充当守卫的对象将根据它们的类类型有自己的 smack 实现。smackAll
但我认为没有理由在每个可能继承的类中重新编写Guard
. 所以我试图这样做,但编译器不允许我这样做。我错过了什么?