我刚从2015 WWDC示例代码(https://developer.apple.com/sample-code/wwdc/2015/)下载了FourInARow,并注意到文件AAPLViewController.m
中有一个奇怪的属性声明
@property NSArray<NSMutableArray<CAShapeLayer *> *> *chipLayers;
这是什么意思?
答案 0 :(得分:12)
它是Objective-C的新成员,名为Lightweight Generics。它是在iOS9 / OS X 10.11中引入的,目的是增强Swift和Objective-C之间的互操作性。正如文档所说:
NSArray,NSSet和NSDictionary类型的Objective-C声明 使用轻量级通用参数化由Swift导入 保留其内容类型的信息。
例如,请考虑以下Objective-C属性声明:
@property NSArray<NSDate *>* dates;
@property NSSet<NSString *>* words;
@property NSDictionary<KeyType: NSURL *, NSData *>* cachedData;
以下是Swift如何导入它们:
var dates: [NSDate]
var words: Set<String>
var cachedData: [NSURL: NSData]
答案 1 :(得分:2)
除了MichałCiuba的回答:
尽管文档(Lightweight Generics)似乎没有明确提及它,但它不仅仅适用于Swift:这种语法确实会影响Objective-C。如果你声明一个可变数组CAShapeLayer*
,那么添加或访问不兼容的元素将产生编译器警告。 E.g。
NSMutableArray<CAShapeLayer*>* array = [NSMutableArray new];
[array addObject:[CATextLayer new]]; // warning
CATextLayer* layer = array[0]; // warning
CALayer* layer = array[0]; // OK, because CALayer is a superclass of CAShapeLayer