4

多くの異なる種類のオブジェクトを受け取り、それらをどうするかを決定するメソッドがあります。

-(void)performAction:(NSObject *)myAction withItem:(Item *)myItem {

actionCount = -1;
NSLog(@"-- NEW ACTION ARRAY --");
if ([myAction isMemberOfClass:[Look class]]) {
    currentActionArray = [self createLookArray:(Look *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Use class]]) {
    currentActionArray = [self createUseArray:(Use *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Exit class]]) {
    currentActionArray = [self createExitArray:(Exit *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[NSArray class]] ) {
    NSLog(@"--- CUSTOM ACTION --- %@", myAction);
    currentActionArray = (NSArray *)myAction;
} 
[self performNextAction];

}

ここでは、Look、Use、Exit、NSArray の 4 つのうちの 1 つが実行されます。最初の 3 つは送信されて NSArray になり、最後の 1 つはすでに NSArray になっています。

ここで、NSArray を別の場所からここに渡すと、次のようになります。

    NSArray *myAction = [[NSArray alloc] initWithObjects:myAction1, myAction2, nil];
[controller performAction:myAction withItem:nil];

... myAction を NSArray ではなく NSCFArray として読み取るため、カスタム アクションは呼び出されません。[myAction isMemberOfClass:[NSCFArray class]] を試してみると、CF が認識されません。現時点で動作させる簡単な方法は、Look、Use、または Exit 以外のものはすべて NSArray であると想定することです (最後の else if を取り除き、else のままにしておきます)。 .

どうすればこれに対処できるか知っている人はいますか?

ありがとう、-k。

4

3 に答える 3

8

isKindOfClass:の代わりに使用してみてくださいisMemberOfClass:

最初のオブジェクトは、送信するクラスのインスタンス、またはそのサブクラスのいずれかであるオブジェクトに対してYESを返します。これは、の場合と同様ですNSCFArray

于 2009-09-17T13:36:27.357 に答える
3

考慮に値する 2 つの可能性:

于 2009-09-17T13:41:10.093 に答える
2

NSСFArrayはNSMutableArrayのサブクラスです

isKindOfClassを使用して確認できます

if ([myAction isMemberOfClass:[Look class]]) {
    currentActionArray = [self createLookArray:(Look *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Use class]]) {
        currentActionArray = [self createUseArray:(Use *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Exit class]]) {
        currentActionArray = [self createExitArray:(Exit *)myAction item:myItem];
} else if ([myAction isKindOfClass:[NSArray class]] ) {
        NSLog(@"--- CUSTOM ACTION --- %@", myAction);
        currentActionArray = (NSArray *)myAction;
} 
于 2009-09-17T13:37:02.047 に答える