2014-08-06 3 views
3

Я смущен насчет сравнения делегатов. То, что я собираюсь сделать, - проверить двух игроков, чтобы увидеть, одинаковы ли они. Но когда я пытаюсь выполнить код ниже, я получаю ошибку компилятора, которая говорит: «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

Ваше имя говорит «тот же экземпляр»; ваше описание говорит «они одинаковы». Так что это? Вы хотите проверить, что они указывают на один и тот же объект или что объекты равны? – newacct

+1

Я хочу проверить, не являются ли они одним и тем же объектом в памяти :) –

ответ

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 
} 
+0

спасибо, что это намного лучший способ –

+0

протокол IPlayer: class { он дает ошибку говорит: «Использование необъявленного типа« Класс »вы использовали для использования« AnyClass » Если я изменю его как AnyClass, тогда он даст еще одну ошибку« Наследование от non-procol типа AnyClass » –

+0

Ok используется NSObjectProtocol ... Iplayer общественный протокол: NSObjectProtocol { он теперь работает –

0

«Iplayer не конвертируется в MirrorDisposition» сообщение об ошибке означает, что компилятор не может найти оператор == для объектов Iplayer. Чтобы это исправить, вы можете определить сами, возможно, как это:

func == (left: IPlayer, right: IPlayer) -> Bool { 
    return left.x == right.x 
} 

Затем вы можете сравнить firstPlayer с secondPlayer без отражения.

+0

На самом деле я пробовал это внутри области действия, но теперь я пробовал это из области видимости, и, похоже, нет ошибки компилятора, спасибо –

Смежные вопросы