核心数据:检测类型并进行铸造

时间:2010-03-15 20:10:01

标签: iphone objective-c core-data

我已经设置了一个核心数据模型,其中包含一个与抽象实体Item具有1> M关系的实体Place,因此项目有很多位置。有几个实体的父级设置为Place

我想根据后代地点类型设置几个UI元素。我有一个看起来像这样的循环:

for (Place *place in item.places) {

}

...但我不知道如何检测这个地方的类型,以及如何将其转换为正确的类型以便我可以访问它的属性。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

不完全确定你在问什么,但听起来你有一些对象的集合是Place的子类,你需要在运行时检测具体的类型。

以下是分支和转换的方法:

for (id object in item.places) {
    if ([object isKindOfClass:[SomeConcretePlace class]]) {
        ((SomeConcretePlace *)object).someProperty = something;

    } else if ([object isKindOfClass:[AnotherConcretePlace class]]) {
        somethingElse = ((AnotherConcretePlace *)object).someProperty;
    }
}

请务必查看isKindOfClass:和isMemberOfClass的文档:在NSObject参考中了解差异,您可以根据具体情况使用。

(您可以将“id object”替换为“Place * object”,我只是在我的代码中使用id。 - 编辑:或者如果它是抽象的话你也不能,请参阅mzarra的评论。“id”工作正常。)

答案 1 :(得分:2)

您可以使用以下几个选项之一确定地点:

  1. 您可以致电[[object entity] name]确定孩子的姓名
  2. 如果您为这些孩子设置了子类NSManagedObject,那么您可以使用[object isKindOfClass:[XXXX class]]
  3. 对其类进行测试

    由于抽象实体永远无法实例化,因此最好将查询结果引用为idNSManagedObject,然后从那里确定您正在处理哪个孩子。这样,从概念上讲,你永远不会对你能做什么和不能实例化感到困惑。

    此外,作为对此的更新,如果您将对象引用为id,则无需转换该对象。 id在这些情况下作为通配符很有用,并且将被信任/假设接受调用类知道的任何类的任何消息(方法调用)(以前导入到类中。在处理多个子对象的情况下,这非常有用。