如何在 Swift 中确认声明其他协议(protocol)属性的协议(protocol)?
有一个协议(protocol)GKGameModel
,其中它的实现者需要具有符合协议(protocol)的属性
public protocol GKGameModel {
// ...
public var players: [GKGameModelPlayer]? { get }
public var activePlayer: GKGameModelPlayer? { get }
// ...
}
public protocol GKGameModelPlayer {
// ...
}
现在,假设我有一个符合上述协议(protocol)的类 Player
和 GameModel
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/