【问题标题】:Compare 2 Objects in Objective-C比较 Objective-C 中的 2 个对象
【发布时间】: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...

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

【问题讨论】:

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


    【解决方案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 子类中。 ......就像我的回答一样。试试吧,它有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-26
      • 1970-01-01
      相关资源
      最近更新 更多