繁体   English   中英

无法在受其他协议限制的通用类型上调用协议方法

[英]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($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实现。 但是我认为没有理由在每个可能继承Guard类中重写smackAll 因此,我正在尝试这样做,但是编译器不允许我这样做。 我想念什么?

以下内容似乎对我有用。

protocol Guard {
    var prisoners: Array<Prisoner>? { get set }
    func smack<Prisoner>(prisoner: Prisoner)
    func smackAll()
}

extension Guard {
    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 }
}

注意:func smack(prisoner:Prisoner)不需要使用T:Prisoner。 它已经是一个接口,并且可以称为该接口,它不会让您在任何地方都没有Prisoner实现者。 您唯一使用的情况是向像T这样的具体类添加更多约束:MyConcrete在其中实现Prisoner

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM