3

AnimalBOOLというプロパティを持つクラスaliveです。MonkeyZebraおよびWalrusのサブクラスですAnimal。、およびのインスタンスの混合を含むNSArrayと呼ばれるのインスタンスがあり、最初の生きているインスタンスを見つけたい場合、次のようにすることができます。zooMonkeyZebraWalrusZebra

Zebra *zebra; 
for (Animal *animal in zoo) {
    if ([animal isMemberOfClass:[Zebra class]] && animal.alive) {
        zebra = animal;
        break;
    }
}

問題は、私が設定したときにコンパイラが互換性のないポインタ型について不平を言うことzebra = animalです。そのようなキャストを行うとうまくzebra = (Zebra *)animalいくようですが、そのようなキャストがObjective-Cで安全かどうかはわかりません。

このような状況に対処するためのより良い方法は何ですか?

4

3 に答える 3

3

それは間違いなくObjective-Cでそれを行う方法です。最初にキャスト先のクラスの種類を確認している場合は、非常に安全です。他の何かに「型付け」された場合でもisMemberOfClass、ランタイムを使用して実際の内容を報告します。

于 2013-08-27T12:17:22.900 に答える
1

同じタスクを実行するもう 1 つの方法。

[zoo enumerateObjectsusingBlock:^(id obj, NSUInteger index, BOOL *stop){
    if ([obj isMemberOfClass:[Zebra class] && animal.alive){
        zebra = (Zebra *)animal;
        *stop = YES;
    }
}];

ところで、このキャスト方法は安全です。

于 2013-08-28T06:42:22.973 に答える