【发布时间】:2013-08-27 12:07:02
【问题描述】:
Animal 是一个具有BOOL 属性的类,称为alive。 Monkey、Zebra 和 Walrus 是 Animal 的子类。如果我有一个名为zoo 的NSArray 实例,其中包含Monkey、Zebra 和Walrus 的混合实例,并且我想找到第一个活着的Zebra 实例,我可能会这样做像这样:
Zebra *zebra;
for (Animal *animal in zoo) {
if ([animal isMemberOfClass:[Zebra class]] && animal.alive) {
zebra = animal;
break;
}
}
问题是当我设置zebra = animal 时编译器抱怨指针类型不兼容。如果我做一些像zebra = (Zebra *)animal 这样的转换,那么它似乎可以工作,但我不确定这种转换在Objective-C 中是否安全。
处理这种情况的更好方法是什么?
【问题讨论】:
-
这种类型的转换在这里很好,因为您已经测试了
anmimal的Zebra类型的蜜蜂。无论如何,从长远来看,isKindOfClass可能会更省钱,因为这也会为Zebra的每个潜在(未来)子类返回 YES。 -
Zebra,您的示例的编写方式,如果集合中没有Animal实例同时属于类Zebra和alive,则未定义。
标签: objective-c cocoa nsarray subclassing