@compatibility_alias
您可以用关键字技巧替换一些 Objective-C 文字的类。
这是一个例子。
@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
关键字的更多信息,请参见此处。
笔记
由于@compatibility_alias
关键字是适用于当前编译单元的编译器指令,因此您需要将编译单元分开以避免与 Apple Foundation Kit 中的 NSObject 类的符号重复。这就是我的做法。
主文件
#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;
}
测试.h
id 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;
}
结果。
2013-03-23 08:54:42.793 return of test = AAAAA!!!
2013-03-23 08:54:42.796 Hello, World!