包含尖括号<>的奇数属性声明语法

我刚刚从2015年WWDC示例代码( https://developer.apple.com/sample-code/wwdc/2015/ )下载了FourInARow,并注意到文件AAPLViewController.m一个奇怪的属性声明

 @property NSArray<NSMutableArray<CAShapeLayer *> *> *chipLayers; 

这是什么意思?

这是Objective-C的新增function,称为轻量级generics 。 它是在iOS9 / OS X 10.11中引入的,目的是为了增强Swift和Objective-C之间的互操作性。 正如文档所述:

使用轻量级generics参数化的NSArray,NSSet和NSDictionarytypes的Objective-C声明由Swift导入,其中保存了有关内容types的信息。

例如,考虑下面的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] 

除了MichałCiuba的回答:

尽pipe文档( Lightweight Generics )似乎没有明确提到它,但并不仅仅是Swift:这个语法确实会影响Objective-C。 如果声明了一个可变数组CAShapeLayer* ,那么添加或访问不兼容的元素将产生编译器警告。 例如

 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