gpt4 book ai didi

objective-c - Objective-C : how to compare primitive types with objects

转载 作者:搜寻专家 更新时间:2023-10-30 20:26:12 25 4
gpt4 key购买 nike

我正在尝试编写一个比较 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com