我对比较代表感到困惑。我要做的是检查两个玩家是否相同。但是当我尝试下面的代码时,我得到一个编译器错误,上面写着:" IPlayer不能转换为MirrorDisposition"。在Swift中检查代理的理想方法是什么?
这是我的代码:
var str = "Hello, playground"
protocol IPlayer{
var x:Int {get set}
}
protocol IMatch{
var ballOwner:IPlayer? {get set}
}
class Player:IPlayer{
var x:Int = 5
}
class Match{
var ballOwner:IPlayer?
}
var firstPlayer:protocol<IPlayer> = Player()
var secondPlayer:protocol<IPlayer> = Player()
//here is the problem !
if firstPlayer == secondPlayer {
println("equal")
}
// if i check with reflection there is no error. But is it correct way?
var a = reflect(firstPlayer)
var b = reflect(secondPlayer)
if a.objectIdentifier == b.objectIdentifier {
println("equal no error")
}
答案 0 :(得分:8)
===
运算符用于检查两个对象引用是否指向同一对象。它在两个AnyObject
个操作数上定义。
但这不会立即奏效,因为firstPlayer
和secondPlayer
不能保证是对象。 IPlayer
协议也可以通过结构和枚举来符合。要将其限制为对象,您必须将其声明为protocol IPlayer : class
。
P.S。 protocol<IPlayer>
只能写成IPlayer
。
protocol IPlayer : class {
var x:Int {get set}
}
class Player : IPlayer {
var x:Int = 5
}
var firstPlayer:IPlayer = Player()
var secondPlayer:IPlayer = Player()
if firstPlayer === secondPlayer {
println("equal")
} else {
println("not equal") // prints "not equal" as expected
}
答案 1 :(得分:0)
“IPlayer无法转换为MirrorDisposition”错误意味着编译器找不到IPlayer对象的==运算符。要解决这个问题,您可以自己定义它,可能是这样的:
func == (left: IPlayer, right: IPlayer) -> Bool {
return left.x == right.x
}
然后,您可以在不使用反射的情况下将firstPlayer与secondPlayer进行比较。