2009-09-08 2 views
3

Есть ли способ сравнить два объекта Objective-C, основанные исключительно на протоколе, который они реализуют.сравнение/равенство двух объектов по протоколу

В частности, я рассматриваю сравнение двух объектов, соответствующих MKAnnotation (аннотации iPhone mapkit). Учитывая два объекта, которые соответствуют протоколу, я хотел бы определить, насколько они равны по отношению к протоколу. В этом случае это означает, что по крайней мере атрибут coordinate является одним и тем же.

ответ

2

С CLLocationCoordinate2D является структурой, вы можете сравнить coordinate @properties двух MKAnnotation s с ==. Пример:

MKAnnotation *a1; 
MKAnnotation *a2; 

if(a1.coordinate == a2.coordinate) { 
    //coordinates equal 
} 

С предостережением: вы заботитесь сравнения значений с плавающей точкой в ​​CLLocationCoordinate2D (широта и долгота полей CLLocationCoordinate2D имеют тип CLLocation, который typdef ред, как double). Как всегда, сравнение двух значений с плавающей запятой для равенства чревато тонкостью. Возможно, вы захотите выполнить более активное сравнение значений широты и долготы независимо (например, проверка затухания, их абсолютная разница находится в небольшом диапазоне). См. Numerical Recipes для получения дополнительной информации по этой проблеме.

Если вы хотите сравнить все свойства, что-то вроде

(a1.coordinate == a2.coordinate) && [a1.title isEqualToString:a2.title] && [a1.subtitle isEqualToString:a2.subtitle] 

(опять-таки с оговоркой сохранения) будет делать трюк.

+0

Вы не ответили на его вопрос. Ваш характер специфичен для его примера, но похоже, что он хочет общее решение. –

+0

Ну, он сказал: «В частности, я смотрю на сравнение двух объектов, соответствующих MKAnnotation», поэтому я думаю, что, по крайней мере, ответил на его конкретный вопрос. –

+0

Я согласен; Я не уверен, как вы можете «сравнить для равенства на основе протокола», если только вы просто не хотите, чтобы вы вызывали -conformsToProtocol: сначала в экземпляре. – Wevah

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