我已经设置了一个核心数据模型,其中包含一个与抽象实体Item
具有1> M关系的实体Place
,因此项目有很多位置。有几个实体的父级设置为Place
。
我想根据后代地点类型设置几个UI元素。我有一个看起来像这样的循环:
for (Place *place in item.places) {
}
...但我不知道如何检测这个地方的类型,以及如何将其转换为正确的类型以便我可以访问它的属性。
感谢您的帮助!
答案 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)
您可以使用以下几个选项之一确定地点:
[[object entity] name]
确定孩子的姓名[object isKindOfClass:[XXXX class]]
由于抽象实体永远无法实例化,因此最好将查询结果引用为id
或NSManagedObject
,然后从那里确定您正在处理哪个孩子。这样,从概念上讲,你永远不会对你能做什么和不能实例化感到困惑。
此外,作为对此的更新,如果您将对象引用为id
,则无需转换该对象。 id
在这些情况下作为通配符很有用,并且将被信任/假设接受调用类知道的任何类的任何消息(方法调用)(即以前导入到类中。在处理多个子对象的情况下,这非常有用。