【问题标题】:Array comparison failing for copied items复制项目的数组比较失败
【发布时间】:2014-01-13 11:52:39
【问题描述】:

我正在尝试比较两个具有我的模型对象的可变数组。在一个数组中,我按原样创建模型对象,而在另一个数组中,我使用copyWithZone 创建原始对象的副本(我的模型是NSObject 的子类)。但是,当我比较时,即使我没有更改任何内容,它也总是失败。

我打印了两个数组只是为了检查,它们似乎都有相同的对象。

isEqualToArray 不会对复制的项目起作用吗?

有人能指出我哪里出错了吗?或者是否有其他方法可以进行这种比较?

【问题讨论】:

  • 数组中有自定义对象吗?
  • 你实现isEqual:hash了吗?默认实现不适用于自定义对象。
  • 显示copyWithZone:isEqual:isEqualTo:的实现。
  • “或者如果有任何其他方法可以进行这种比较” ...您是否努力寻找另一种方法?从字面上看,stackoverflow 上已经有多少答案了
  • 你能粘贴你的代码吗??

标签: ios iphone objective-c nsmutablearray nscopying


【解决方案1】:

当涉及到对象之间的比较时,isEqualhash 方法应该被覆盖。只有当对象通过isEqual 测试时,isEqualToArray 才会返回 true。所以请在你的模态对象中实现isEqualhash 方法。之后你就可以使用isEqualToArray 方法了。

【讨论】:

    【解决方案2】:

    我建议您以类似于以下示例的格式覆盖两个 NSObject 子类上的 isEqual: 方法。

    假设有 Object 类的对象和比较对象。两者都包含名为 propA (nsnumber) 和 propB (nsstring) 的属性。即使这两个对象属于同一个子类,这也会起作用。

    -(BOOL)isEqual:(id)object {
        if ([object isKindOfClass:[ComparedObject class]]) {
            if ([self.propA isEqualToNumber:object.propA] && [self.propB             
                isEqualToString:object.propB]) {
                return YES;
            }
        }
        return NO;
    }
    

    然后,您可以简单地遍历数组的内容,并在下面显示的示例方法中检查每个对象。

    - (BOOL) isArrayEqual:(NSMutableArray *)fArray compareTo:(NSMutableArray *)sArray {
        for (CustomObject *obj in fArray) {
            NSUInteger index = [fArray indexOfObject:obj];
            if (![obj isEqual:[sArray objectAtIndex:index]]) {
                return NO;
            }
        }
        return YES;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-13
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 2015-11-02
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多