Swift:符合协议中的属性?

时间:2017-03-25 06:20:53

标签: swift swift-protocols gameplay-kit

如何确认在Swift中声明其他协议属性的协议?

有一个协议GKGameModel,其实施者需要具有符合协议的属性

public protocol GKGameModel {
    // ...
    public var players: [GKGameModelPlayer]? { get }
    public var activePlayer: GKGameModelPlayer? { get }
    // ...

}

public protocol GKGameModelPlayer {
    // ...
}

现在,假设我有一个符合上述协议的课程PlayerGameModel

class Player : NSObject, GKGameModelPlayer  {
    //...
}


class GameModel : NSObject, GKGameModel  {
    //...
    public var players: [Player]? 
    public var activePlayer: Player?
}

现在上面的代码没有编译,错误消息(以及其他)是:

protocol requires property 'activePlayer' with type 'GKGameModelPlayer?'; do you want to add a stub?
candidate has non-matching type 'Player?'

但是Player类符合协议GKGameModelPlayer,因此它应该确认没问题。我怎样才能编译它?

奇怪的是Objective-C处理这个问题就好了 - 看看FourInARow示例代码,它做了类似的事情。

2 个答案:

答案 0 :(得分:0)

协议要求完全按照所示键入属性。换句话说,GKGameModelPlayer s和单个可选GKGameModelPlayer?的数组。如果您的Player类型符合协议,那么Player的数组可以传递给协议属性(如果已转换/输入为[GKGameModelPlayer])。

但是,此处的要求不是,例如,activePlayer属性的类型符合GKGameModelPlayer,而是activePlayer属性引用它键入/转换为GKGameModelPlayer的实例。

即。这样可以解决错误:

class GameModel : NSObject, GKGameModel  {
    //...
    public var players: [GKGameModelPlayer]? 
    public var activePlayer: GKGameModelPlayer?
}

答案 1 :(得分:0)

playersactivePlayer属性的类型符合GKGameModelPlayer。因此,只需将其更改为GKGameModelPlayer类型而不是Player

class GameModel : NSObject, GKGameModel  {
    //...
    public var players: [GKGameModelPlayer]? 
    public var activePlayer: GKGameModelPlayer?
}