C# のように Objective-C にキャスト キーワードはありますか ( as
):
Foo bar = new Foo();
Foo tmp = bar as Foo;
これはObjective-Cで可能ですか?
C# のように Objective-C にキャスト キーワードはありますか ( as
):
Foo bar = new Foo();
Foo tmp = bar as Foo;
これはObjective-Cで可能ですか?
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]];
いいえ、そのようなキーワードは存在しませんが、マクロを使用してそのような動作をエミュレートできます。
#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
副作用がある場合、パフォーマンスの問題やその他の問題につながる可能性があります。
型キャスト (それはちょうど C です):
Foo *foo = [[Foo alloc] init];
Bar *bar = (Bar *)foo;
注意: これで足を撃たれる可能性があります。注意してください。