2015-10-14 90 views
0

限制通用类型调用协议方法我有以下:无法由其它协议

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对其他对象的。根据他们的班级类型,充当警卫的对象将会有自己的实现。但我认为没有理由在每个可能继承Guard的课程中重写smackAll。所以我试图这样做,但编译器不让我。我错过了什么?

回答

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实施囚犯

+0

非常感谢你的帮助。我想我试图以不正确的方式使用泛型为我想做的事(我今天只有在他们使用它们时才发现它们)。 – user2320861