Objective-C 中是否有类似 C# ( as
) 的 cast 关键字:
Foo bar = new Foo();
Foo tmp = bar as Foo;
这在Objective-C中可能吗?
Objective-C 中是否有类似 C# ( as
) 的 cast 关键字:
Foo bar = new Foo();
Foo tmp = bar as Foo;
这在Objective-C中可能吗?
as
在 Objective-C 中没有直接的等价物。有常规类型转换(C 风格)。
如果要检查对象的类型,请务必调用isKindOfClass:
.
写相当于:
Foo bar = new Foo();
Foo tmp = bar as Foo;
你会写:
Foo *bar = [Foo new];
Foo *tmp = ([bar isKindOfClass:[Foo class]]) ? (Foo *)bar : nil;
你总是可以把它写成一个类别,比如:
@implementation NSObject (TypeSafeCasting)
- (id) asClass:(Class)aClass{
return ([self isKindOfClass:aClass]) ? self : nil;
}
@end
然后你可以这样写:
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);
}
}
输出:
bar as Foo:
<Foo: 0x682f2d0>
bar as Foo: (null)
我建议直接检查isKindOfClass:
而不是使用名称不佳的宏,例如AS
. 此外,如果宏的第一个参数是表达式,例如 ( [foo anotherFoo]
),它将被计算两次。anotherFoo
如果有副作用,这可能会导致性能问题或其他问题。
类型转换(只是 C):
Foo *foo = [[Foo alloc] init];
Bar *bar = (Bar *)foo;
注意:你可以用这个射击自己的脚,小心。