NsArray ContainsObject 不适用于自定义 NsObject Class
NsArray ContainsObject is not working with Custom NsObject Class
我正在检查我的数组之一是否包含我创建自定义方式的 Nsobject
。
我正在使用 ContainsObject
method.my 问题是包含对象不工作 ever.even 虽然我在数组中有相同的对象但它不是 return 的真实值。
if([self.arrSelectedInterest containsObject:interest_ent])
我还附上了我的调试点的屏幕截图,其中显示了 nsarray 和比较对象的值,并且我发现 interest_ent
是包含在 self.arrSelectedInterest
中的同一对象
而且它总是 return false。
有人知道如何检查我的自定义 nsobject 的 nsarray 是否包含特定对象吗?
以下是我的散列和 isEqual 方法,我已覆盖并在 nsobejct 中显示了我的 属性 类型。
@interface 兴趣实体:JSONModel
@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
处理可空对象的方法
即如果两个字符串为 null isEqualToString:
将 return 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;
}
我正在检查我的数组之一是否包含我创建自定义方式的 Nsobject
。
我正在使用 ContainsObject
method.my 问题是包含对象不工作 ever.even 虽然我在数组中有相同的对象但它不是 return 的真实值。
if([self.arrSelectedInterest containsObject:interest_ent])
我还附上了我的调试点的屏幕截图,其中显示了 nsarray 和比较对象的值,并且我发现 interest_ent
是包含在 self.arrSelectedInterest
中的同一对象
而且它总是 return false。
有人知道如何检查我的自定义 nsobject 的 nsarray 是否包含特定对象吗?
以下是我的散列和 isEqual 方法,我已覆盖并在 nsobejct 中显示了我的 属性 类型。 @interface 兴趣实体:JSONModel
@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
处理可空对象的方法
即如果两个字符串为 null isEqualToString:
将 return 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;
}