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

时间:2015-10-14 23:16:50

标签: ios generics swift-extensions swift-protocols

我有以下内容:

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。所以我试图这样做,但编译器不允许我这样做。我错过了什么?

1 个答案:

答案 0 :(得分:0)

以下似乎对我有用。

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(囚犯:囚犯)你不需要使用T:囚犯。它已经是一个界面,可以被引用到界面,它不会让你在那里放任何不是囚犯实施者的东西。你将使用它的唯一情况是向一个具体类添加更多约束,如T:MyConcrete实现囚犯