【问题标题】:NsArray ContainsObject is not working with Custom NsObject ClassNsArray ContainsObject 不适用于自定义 NsObject 类
【发布时间】:2015-05-17 04:14:14
【问题描述】:

我正在检查我的数组之一是否包含我创建自定义方式的Nsobject。 我正在使用ContainsObject 方法。我的问题是包含的对象永远无法正常工作。即使我在数组中有相同的对象,它也没有返回真实值。

if([self.arrSelectedInterest containsObject:interest_ent])

我还附上了我的调试点的屏幕截图,它显示了 nsarray 的值和比较对象,我发现 interest_ent 是包含在 self.arrSelectedInterest 中的同一个对象 但它仍然总是返回 false。

有人知道如何检查我的自定义 nsobject 的 nsarray 是否包含特定的对象吗?

以下是我的 hash 和 isEqual 方法,我已经覆盖了它们,并且还在 nsobejct 中显示了我的属性类型。 @interface InterestEntity : JSON模型

@property (strong, nonatomic) NSString* InterestId;
@property (strong, nonatomic) NSString* Name;
@property (strong, nonatomic) NSString<Optional>* Code;
@property (strong, nonatomic) NSString<Optional>* Description;
@property (strong, nonatomic) NSArray<Optional>* Hashtags;


- (NSUInteger)hash {
    NSUInteger result = 1;
    NSUInteger prime = 31;

    result = prime * result + [self.InterestId hash];
    result = prime * result + [self.Name hash];
    result = prime * result + [self.Code hash];
    result = prime * result + [self.Description hash];
    result = prime * result + [self.Hashtags hash];
    return result;
}
- (BOOL)isEqual:(id)object {
    BOOL result = NO;

    if ([object isKindOfClass:[self class]]) {
        result = [[self InterestId] isEqualToString:[object InterestId]] &&
        [[self Name] isEqualToString:[object Name]] &&
        [[self Code] isEqualToString:[object Code]] &&[[self Description] isEqualToString:[object Description]] && [[self Hashtags] isEqual:[object Hashtags]];
    }

    return result;
}

【问题讨论】:

  • 您是否在自定义类上正确实现了isEqual:hash 方法?
  • 不,我的 nsobject 类中没有这些方法
  • 那是你的问题。 containsObject: 在对象上使用 isEqual:。默认实现只是查看对象指针。
  • 你能解释一下如何在我的 nsobject 中覆盖它吗?
  • @YogeshSuthar 这是因为isEqual: 的默认实现是比较内存。它与containsObject: 无关。这都是关于isEqual: 的实现。只要在自定义类中正确实现了isEqual:,您就会得到所需的行为。

标签: ios objective-c compare nsarray nsobject


【解决方案1】:

问题在于在处理可空对象时实现isEqual 方法

即如果两个字符串为 null isEqualToString: 将返回 false

这是处理所有情况的正确实现

- (BOOL)isEqual:(id)object {
    if (object == self)
        return YES;
    if (!object || ![object isKindOfClass:[self class]])
        return NO;

    // not nullable fields
    if (![self.interestId isEqualToString:object.interestId])    
        return NO;   
    if (![self.name isEqualToString:object.name])    
        return NO;
    if (![self.code isEqualToString:object.code])    
        return NO;

    // nullable fields (2 if statements for more clean code)
    if (self.description != null && ![self.description isEqualToString:object.description])    
        return NO;    
    if (object.description != null && ![object.description isEqualToString:self.description])    
        return NO;

    if (self.hashtags != null && ![self.hashtags isEqualToString:object.hashtags])    
        return NO;    
    if (object.hashtags != null && ![object.hashtags isEqualToString:self.hashtags])    
        return NO;  


    return YES;
}

【讨论】:

  • 任何想法..如何调用此方法?
猜你喜欢
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多