代码之家  ›  专栏  ›  技术社区  ›  Tim Sullivan

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

  •  1
  • Tim Sullivan  · 技术社区  · 15 年前

    我已经建立了一个包含实体的核心数据模型, Item 与抽象实体的关系为1->m Place 使一个物品有许多地方。有多个实体的父级设置为 地点 .

    我想根据派生的位置类型设置几个UI元素。我有一个这样的循环:

    for (Place *place in item.places) {
    
    }
    

    …但我不知道该如何检测这个地方是什么类型,以及如何将它强制转换为正确的类型,以便我可以访问它的属性。

    谢谢你的帮助!

    2 回复  |  直到 15 年前
        1
  •  2
  •   Jaanus    15 年前

    不完全确定您在问什么,但听起来您有一组属于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引用中,为了了解区别,您可以根据情况使用其中之一。

    (你可以用“place*object”代替“id-object”,我只是在代码中使用id。--编辑:或者,如果它是抽象的,也许你不能,看看Mzarra的评论。”ID“工作正常。)

        2
  •  2
  •   Marcus S. Zarra    15 年前

    您可以通过以下几个选项之一确定位置:

    1. 你可以打电话 [[object entity] name] 确定孩子的名字
    2. 如果您有这些子类的nsmanagedObject子类,那么可以使用 [object isKindOfClass:[XXXX class]]

    因为抽象实体永远无法实例化,所以最好将查询结果引用为 id NSManagedObject 然后决定你要和哪个孩子打交道。这样,从概念上讲,你永远不会对你能和不能实例化的东西感到困惑。

    另外,作为对此的更新,如果将对象引用为 身份证件 . 身份证件 在这些情况下作为通配符很有用,并且将被信任/假定接受调用类所知道的任何类的任何消息(方法调用)( 以前导入到类中的。这在处理多个子对象的情况下非常有用。