比较 Objective-C 中的 2 个对象

Posted

技术标签:

【中文标题】比较 Objective-C 中的 2 个对象【英文标题】:Compare 2 Objects in Objective-C 【发布时间】:2013-12-06 00:47:33 【问题描述】:

在我的应用程序中,我想比较实体“锻炼”的 2 个核心数据实例。我想检查这 2 个对象的所有属性是否具有相同的属性值。本质上,如果两个对象相同减去关系,whosWorkout。有没有办法在不手动检查每个属性的情况下做到这一点?我知道我能做到:

if(object1.intAttr == object2.intAttr)
    NSLog(@"This attribute is the same");

else
    return;


repeat with different attributes...

有没有什么核心数据方法可以让这件事变得不那么乏味?

【问题讨论】:

【参考方案1】:

首先我会像这样在Workout 子类中创建一个isEqual 方法...

-(BOOL)isEqualToWorkout:(Workout*)otherWorkout

    return [self.attribute1 isEqual:otherWorkout.attribute1]
        && [self.attribute2 isEqual:otherWorkout.attribute2]
        && [self.attribute3 isEqual:otherWorkout.attribute3]
        && [self.attribute4 isEqual:otherWorkout.attribute4]
        ...;

然后,当您想与 Workout 对象进行比较时,只需使用...

BOOL equal = [workout1 isEqualToWorkout:workout2];

【讨论】:

Core Data 文档中特别提到你不能覆盖isEqual:。相反,应该创建isEqualToWorkout: @LeoNathan 已编辑。请删除反对票。我在这里用我的 iPhone 打字,所以无法轻松访问文档或 Xcode :-)【参考方案2】:

您可以按名称遍历属性。

for (NSString *attribute in object.entity.attributesByName) 
    if ([[object  valueForKey:attribute] intValue] != 
        [[object2 valueForKey:attribute] intValue]) 
       return NO;
    

return YES;

这假定所有整数属性。您可以执行 switch 语句来检查具有 class 方法的类并处理不同的数据类型。

【讨论】:

它是任何 MSManagedObject 类的蓝图。 当然是相关的。通用解决方案比特定解决方案更相关。这可以用作NSManagedObject 类别比较两个托管对象的基础。这怎么不相关? @Foggy 我知道 == 比较指针地址。上面,我展示了如何比较标量值。【参考方案3】:

如果你需要比较一个对象是否比另一个对象代表更大或更小的值,你不能使用标准的 C 比较运算符 > 和

if ([someDate compare:anotherDate] == NSOrderedAscending) 

    // someDate is earlier than anotherDate


【讨论】:

【参考方案4】:

我最终做了以下事情:

-(BOOL)areEqual:(Workout *)firstWorkout secondWorkout:(Workout *)secondWorkout
    NSArray *allAttributeKeys = [[[firstWorkout entity] attributesByName] allKeys];

    if([[firstWorkout entity] isEqual:[secondWorkout entity]]
       && [[firstWorkout committedValuesForKeys:allAttributeKeys] isEqual:[secondWorkout committedValuesForKeys:allAttributeKeys]]) 
        return YES;
    
    else
        return NO;
    

【讨论】:

您的想法是对的,但听起来您在 Workout 以外的某个类中实现了您的 -areEqual:... 方法。更典型的模式是在将要比较的对象的类中实现相等方法,在这种情况下为Workout。那会让你写if ([workout1 isEqualToWorkout:workout2]) ...,这是Objective-C中的常用模式。 @Caleb:锻炼是一个托管对象类。如果我在那里完成了该方法,则两个对象实例都不存在。在这个类中这样做是正确的,它是利用托管对象的视图控制器。 @JosueEspinosa 你错了。您要比较的实体是 Workout 对象。如果 ibject Exocet 创建并存储在 Core Data 存储中,则它与任何其他类型相同。您可以将方法放入对实体进行操作的 Workout 子类中。 ......就像我的回答一样。试试吧,它有效。

以上是关于比较 Objective-C 中的 2 个对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 ARC 的 Objective-C 代表

Effective Objective-C 2.0 — 第14条:理解“类对象“的用意

如何在objective-c中比较两个具有很多属性的对象

Objective-C中的引用计数

如何使用 Objective-C 从 IOS Cordova 中的设备(本地数据库)中删除图像

Objective-C:tableview中的2个不同的自定义单元格[关闭]