任何人都可以详细说明为什么Swift对以下代码不满意? Swift编译器抱怨GameBoard类不符合协议。这在Java中是允许的。
protocol PGameBoard {
func buildSettlement(point: Point, playerId: Player.Id) -> PGameBoard
}
class GameBoard: PGameBoard {
var dummy: String
init(dummy: String) {
self.dummy = dummy
}
public func buildSettlement(point: Point, playerId: Player.Id) -> GameBoard {
return GameBoard(dummy: "settlement is built")
}
}
我很欣赏如果我从具体实现中返回PGameBoard它会解决问题,但是根据我的Java经验,我发现在接口代码中引用接口和实现代码中的具体类更好。有时我想调用GameBoard.buildSettlement()并返回GameBoard而不是PGameBoard。
与Hamish的有用回复相关 - 我发现情况的形式描述是要求返回类型是协议返回类型的协变。从Swift 3.0开始,这种行为没有实现。但是,关于swift-evolution的Chris Lattner认为这是一个错误,并且在所有情况下都应该允许协变返回类型。