如何确认在Swift中声明其他协议属性的协议?
有一个协议GKGameModel
,其实施者需要具有符合协议的属性
public protocol GKGameModel {
// ...
public var players: [GKGameModelPlayer]? { get }
public var activePlayer: GKGameModelPlayer? { get }
// ...
}
public protocol GKGameModelPlayer {
// ...
}
现在,假设我有一个符合上述协议的课程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
类符合协议GKGameModelPlayer
,因此它应该确认没问题。我怎样才能编译它?
奇怪的是Objective-C处理这个问题就好了 - 看看FourInARow示例代码,它做了类似的事情。
答案 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)
players
和activePlayer
属性的类型符合到GKGameModelPlayer
。因此,只需将其更改为GKGameModelPlayer
类型而不是Player
class GameModel : NSObject, GKGameModel {
//...
public var players: [GKGameModelPlayer]?
public var activePlayer: GKGameModelPlayer?
}