比较Objective-C中的2个对象

时间:2013-12-06 00:47:34

标签: ios objective-c cocoa-touch cocoa core-data

在我的应用程序中,我想比较实体“Workout”的2个核心数据实例。我想检查2个对象的所有属性是否具有相同的属性值。基本上如果两个对象相同,减去关系,那就是workout。有没有办法在不手动检查每个属性的情况下执行此操作?我知道我能做到:

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

repeat with different attributes...

是否有任何核心数据方法可以减少繁琐?

4 个答案:

答案 0 :(得分:3)

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

-(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];

答案 1 :(得分:2)

您可以按名称迭代属性。

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

这假设所有整数属性。您可以使用switch语句检查具有class方法的类,并处理不同的数据类型。

答案 2 :(得分:0)

如果需要比较一个对象是代表比另一个对象更大还是更小的值,则不能使用标准C比较运算符>和<。相反,基本的Foundation类型,如NSNumber,NSString和NSDate,提供了compare:方法:

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

    // someDate is earlier than anotherDate

}

答案 3 :(得分:-1)

我最终做了以下事情:

-(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;
    }
}