你如何isEqual:
在Objective-C中正确覆盖?"catch"似乎是如果两个对象相等(由isEqual:
方法确定),它们必须具有相同的散列值.
" 可可基础指南"的 " 内省"部分确实有一个示例,说明如何为名为的类重写,如下所示:isEqual:
MyWidget
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![other isKindOfClass:[self class]])
return NO;
return [self isEqualToWidget:other];
}
- (BOOL)isEqualToWidget:(MyWidget *)aWidget {
if (self == aWidget)
return YES;
if (![(id)[self name] isEqual:[aWidget name]])
return NO;
if (![[self data] isEqualToData:[aWidget data]])
return NO;
return YES;
}
Run Code Online (Sandbox Code Playgroud)
它检查指针相等性,然后检查类相等性,最后比较使用的对象isEqualToWidget:
,它只检查name
和data
属性.该示例未显示的是如何覆盖hash
.
比方说,让我们假设有其他属性不会影响平等age
.如果没有hash
方法被覆盖,使得只有name
和data
影响哈希?如果是这样,你会怎么做?只需添加的哈希 …
假设我在层次结构中组织了Parent
实体,Child
它们是根实体并且是子类Parent
.我想设置一个NSArrayController
只获取实体Parent
,但不是Child
.
如果您在Interface Builder中设置的实体名称的阵列控制器来Parent
,它获取所有Parent
和Child
实体.我最初尝试在Interface Builder中将数组控制器的fetch谓词设置为:
entity.name == "Parent"
Run Code Online (Sandbox Code Playgroud)
这适用于XML存储,但是当我切换到SQLite存储时,它不再起作用.我收到以下错误:
keypath entity.name not found in entity <NSSQLEntity xxx>
Run Code Online (Sandbox Code Playgroud)
作为一种解决方法,我在我的设置过滤谓词(具有与entity.name
上面相同的谓词)awakeFromNib
仅过滤父实体.显然,一旦实体在内存中,该谓词就有效,但您不能在SQL支持的提取谓词中使用它.
有没有办法只提取Parent
实体,而不是Child
使用与SQLite存储一起使用的提取谓词的实体?使用过滤谓词来提取您只会忽略的实体似乎很浪费.