您可以用 class 替换某些 Objective-C 文字@compatibility_alias
关键词技巧。
这是一个例子。
@compatibility_alias NSNumber AAA;
当然,您应该为新类提供正确的实现。
#import <Foundation/NSObject.h>
@interface AAA : NSObject
+ (id)numberWithInt:(int)num;
@end
@implementation AAA
+ (id)numberWithInt:(int)num
{
return @"AAAAA!!!"; // Abused type system just to check result.
}
@end
@compatibility_alias NSNumber AAA;
现在 Clang 将为您完成这项工作。我确认这适用于数字、数组、字典文字。不幸的是,字符串文字似乎是静态发出的,因此它不起作用。
欲了解更多信息@compatibility_alias
关键词,see here https://stackoverflow.com/questions/178434/what-is-the-best-way-to-solve-an-objective-c-namespace-collision#180674.
Note
Because @compatibility_alias
关键字是适用于当前编译单元的编译器指令,您需要将编译单元分开以避免与Apple Foundation Kit中的NSObject类重复符号。我是这样做的。
main.m
#import "test.h" // Comes before Foundation Kit.
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool
{
NSLog(@"return of test = %@", test());
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
}
test.h
id test();
test.m
#import "test.h"
#import <Foundation/NSObject.h>
@interface
AAA : NSObject
+ (id)numberWithInt:(int)v;
+ (id)arrayWithObjects:(id*)pobj count:(int)c;
+ (id)dictionaryWithObjects:(id*)pvals forKeys:(id*)pkeys count:(int)c;
@end
@implementation AAA
+ (id)numberWithInt:(int)v
{
return @"AAAAA as number!!!";
}
+ (id)arrayWithObjects:(id*)pobj count:(int)c
{
return @"AAAAA as array!!!";
}
+ (id)dictionaryWithObjects:(id*)pvals forKeys:(id*)pkeys count:(int)c
{
return @"AAAAA as dictionary!!!";
}
@end
@compatibility_alias NSDictionary AAA;
@compatibility_alias NSArray AAA;
@compatibility_alias NSNumber AAA;
id test()
{
// return @{};
// return @[];
return @55;
}
Result.
2013-03-23 08:54:42.793 return of test = AAAAA!!!
2013-03-23 08:54:42.796 Hello, World!