1

Objective-C 中是否有类似 C# ( as) 的 cast 关键字:

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

这在Objective-C中可能吗?

4

3 回答 3

6

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]];
于 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);
    }
}

输出:

bar as Foo: <Foo: 0x682f2d0>
bar as Foo: (null)

我建议直接检查isKindOfClass:而不是使用名称不佳的宏,例如AS. 此外,如果宏的第一个参数是表达式,例如 ( [foo anotherFoo]),它将被计算两次。anotherFoo如果有副作用,这可能会导致性能问题或其他问题。

于 2012-12-13T21:47:23.077 回答
-1

类型转换(只是 C):

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

注意:你可以用这个射击自己的脚,小心。

于 2012-12-13T21:34:24.057 回答