1

C# のように Objective-C にキャスト キーワードはありますか ( as):

Foo bar = new Foo();
Foo tmp = bar as Foo;

これはObjective-Cで可能ですか?

4

3 に答える 3

6

There is no direct equivalent of as in Objective-C. There is regular type casting (C-style).

If you want to check the type of the object, be sure to call isKindOfClass:.

To write the equivalent of:

Foo bar = new Foo();
Foo tmp = bar as Foo;

You'd write:

Foo *bar = [Foo new];
Foo *tmp = ([bar isKindOfClass:[Foo class]]) ? (Foo *)bar : nil;

You could always write this up as a category like:

@implementation NSObject (TypeSafeCasting)

- (id) asClass:(Class)aClass{
   return ([self isKindOfClass:aClass]) ? self : nil;
}

@end

Then you could write it like:

Foo *bar = [Foo new];
Foo *tmp = [bar asClass:[Foo class]];
于 2012-12-13T21:35:33.247 に答える
1

いいえ、そのようなキーワードは存在しませんが、マクロを使用してそのような動作をエミュレートできます。

#define AS(x,y) ([(x) isKindOfClass:[y class]] ? (y*)(x) : nil)

@interface Foo : NSObject
@end
@implementation Foo
@end

int main(int argc, char *argv[])
{
    @autoreleasepool {

        Foo *bar = [[Foo alloc] init];
        Foo *tmp = AS(bar, Foo);

        NSLog(@"bar as Foo: %@", tmp);

        bar = [NSArray array];
        tmp = AS(bar, Foo);
        NSLog(@"bar as Foo: %@", tmp);
    }
}

出力:

Foo としてのバー: Foo としての<Foo: 0x682f2d0>
バー: (null)

isKindOfClass:のような不適切な名前のマ​​クロを使用するのではなく、直接確認することをお勧めしASます。また、マクロの最初のパラメータが ( [foo anotherFoo]) などの式の場合、2 回評価されます。anotherFoo副作用がある場合、パフォーマンスの問題やその他の問題につながる可能性があります。

于 2012-12-13T21:47:23.077 に答える
-1

型キャスト (それはちょうど C です):

Foo *foo = [[Foo alloc] init];
Bar *bar = (Bar *)foo;

注意: これで足を撃たれる可能性があります。注意してください。

于 2012-12-13T21:34:24.057 に答える