Swift:符合协议(protocol)中的属性?

标签 swift swift-protocols gameplay-kit

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

有一个协议(protocol)GKGameModel,其中它的实现者需要具有符合协议(protocol)的属性

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

}

public protocol GKGameModelPlayer {
    // ...
}

现在,假设我有一个符合上述协议(protocol)的类 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 类符合协议(protocol) GKGameModelPlayer,因此它应该可以很好地确认。我怎样才能编译它?

奇怪的是,Objective-C 很好地处理了这个问题 - 看看 FourInARow执行类似操作的示例代码。

最佳答案

协议(protocol)要求属性的键入与所示的完全一致。换句话说,一个 GKGameModelPlayer 数组和一个可选的 GKGameModelPlayer?。如果您的 Player 类型符合协议(protocol),则如果强制转换/键入为 [GKGameModelPlayer],则可以将 Player 数组传递给协议(protocol)属性>。

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

即这将修复错误:

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

关于Swift:符合协议(protocol)中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43013246/

相关文章:

swift - 将 self 作为参数传递给需要与 self 相同类型作为参数的协议(protocol)函数

Swift - 内容 View 的大小与 UITableViewCell 不匹配

ios - Swift:为什么点击手势识别器不是每次都能工作?

swift - 非 -'@objc' 方法不满足 '@objc' 协议(protocol)的可选要求

Swift Casting 未按预期工作

ios - 我不断收到错误 'Instance member isPaused cannot be used on type GameScene'

swift - GameplayKit + SceneKit, GKAgent 旋转转换

ios - 在 swift 4 中添加/更新自定义对象字典数组

ios - 执行 UINavigationController 异常