Цель C: как сравнить примитивные типы с объектами - PullRequest
3 голосов
/ 03 марта 2012

Я пытаюсь написать метод, который сравнивает 2 объекта.У меня проблема: как узнать, является ли свойство примитивного типа?

+(BOOL)isObject:(void*)object1 equalTo:(void*)object2
{
if (object1 == nil && object2 == nil)
    return TRUE;

if ((object1 != nil && object2 == nil) ||
    (object1 == nil && object2 != nil) || 
    ([object1 class] != [object2 class]))
    return FALSE;

if (object1 != object2)
{
    u_int count;
    Ivar* ivars = class_copyIvarList([object1 class], &count);
    for (int i=0; i < count; i++)
    {
        id v1 = object_getIvar(object1, ivars[i]);
        id v2 = object_getIvar(object2, ivars[i]);
        if (![ObjectComparer isObject:v1 equalTo:v2])
            return FALSE;
    }
}
return TRUE;    
} 

Это будет работать для объектов, но не для примитивных типов.Другое дело, я хочу передать параметры как нечто общее, например, id, но это не работает для примитивов.По крайней мере, мне нужно знать, что это примитивный тип, и преобразовать его в id.

Есть идеи?

1 Ответ

1 голос
/ 03 марта 2012

Ответ строго на свойства (как в class_copyPropertyList), а не на переменные экземпляра (согласно class_copyIvarList) вашего текущего кода ...

Люди обычно обдумывают проблему, используя кодирование значения ключа. Если вы используете valueForKey:, то среда выполнения автоматически продвигает примитивы к типам объектов.

Если бы вы реализовали это на уровне Objective-C, вы бы получили NSMethodSignature с использованием -methodSignatureForSelector: и проверили свойство methodReturnType, которое находится в стандартной форме кодирования типа Objective-C (т. Е. совпадение @encode).

Работая напрямую со средой выполнения C, я думаю, вы бы использовали method_copyReturnType на геттере.

Что касается переменных экземпляра, я не уверен, что есть способ запросить их тип.

Также обратите внимание, что нормальный способ справиться с этим состоит в том, чтобы объекты сами реализовывали isEqual:. Это часть NSObject, поэтому гарантированно всегда будет определяться. Сами классы должны реализовывать логику, необходимую для сравнения по значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...