我正在尝试编写一个比较 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。
有什么想法吗?
最佳答案
严格根据属性(如 class_copyPropertyList
)回答,而不是根据实例变量(根据你当前代码的 class_copyIvarList
)...
人们通常使用键值编码来回避这个问题。如果您使用 valueForKey:
,那么运行时会自动将原语提升为对象类型。
如果您要在 Objective-C 级别实现它,您将使用 -methodSignatureForSelector:
获得 NSMethodSignature
并检查 methodReturnType
属性,它是标准的Objective-C类型编码形式(即匹配@encode
)。
如果直接使用 C 运行时,我想您会在 getter 上使用 method_copyReturnType
。
至于实例变量,我不确定有没有办法查询它们的类型。
另请注意,处理此问题的正常方法是让对象自己实现 isEqual:
.它是 NSObject
的一部分,所以保证总是被定义。类本身应实现按值执行比较所需的逻辑。
关于objective-c - Objective-C : how to compare primitive types with objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9541908/