Задача C: как сравнивать примитивные типы с объектами

Я пытаюсь написать метод, который сравнивает 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, но не работает для примитивов. По крайней мере, мне нужно знать, что это примитивный тип, и преобразовать его в идентификатор.

Есть идеи?


person user1069911    schedule 02.03.2012    source источник
comment
Почему вы не используете метод isEqual: (или связанные методы, такие как isEqualToString: для типов NSString), которые есть у всех объектов? Или, точнее, какова цель и конечная цель этого метода?   -  person Itai Ferber    schedule 03.03.2012


Ответы (1)


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

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

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

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

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

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

person Tommy    schedule 03.03.2012