比较两个委托对象是同一个实例

时间:2014-08-06 14:40:16

标签: ios swift

我对比较代表感到困惑。我要做的是检查两个玩家是否相同。但是当我尝试下面的代码时,我得到一个编译器错误,上面写着:" 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")
}

2 个答案:

答案 0 :(得分:8)

===运算符用于检查两个对象引用是否指向同一对象。它在两个AnyObject个操作数上定义。

但这不会立即奏效,因为firstPlayersecondPlayer不能保证是对象。 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进行比较。