当返回具体类型以满足协议时,Swift'不符合协议'

时间:2017-07-08 18:50:09

标签: swift protocols

任何人都可以详细说明为什么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认为这是一个错误,并且在所有情况下都应该允许协变返回类型。

0 个答案:

没有答案