我是Mac/iPhone编程和Objective-C的新手。在C#和Java中,我们有“泛型”集合类,其成员只能是声明的类型。例如,在C#中Dictionary<int, MyCustomObject>
只能包含整数键和MyCustomObject类型的值。在Objective-C中是否存在类似的机制?
最佳答案
苹果在Xcode 7中向Objective-C引入了“轻量级泛型”。在Objective-C中,如果类型不匹配,它们将生成编译器警告。
NSArray<NSString*>* arr = @[@"str"];
NSString* string = [arr objectAtIndex:0];
NSNumber* number = [arr objectAtIndex:0]; // Warning: Incompatible pointer types initializing 'NSNumber *' with an expression of type 'NSString *'
在Swift代码中,它们将产生编译器错误:
var str: String = arr[0]
var num: Int = arr[0] //Error 'String' is not convertible to 'Int'
轻量级泛型旨在与NSArray,NSDictionary和NSSet一起使用,但您也可以将它们添加到自己的类中:
@interface GenericsTest<__covariant T> : NSObject
-(void)genericMethod:(T)object;
@end
@implementation GenericsTest
-(void)genericMethod:(id)object {}
@end
使用编译器警告时,Objective-C的行为将像以前一样。
GenericsTest<NSString*>* test = [GenericsTest new];
[test genericMethod:@"string"];
[test genericMethod:@1]; // Warning: Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'
但是Swift会完全忽略通用信息。 (在Swift 3+中不再适用。)
var test = GenericsTest<String>() //Error: Cannot specialize non-generic type 'GenericsTest'
Interacting with Objective-C APIs