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

时间:2015-06-09 10:53:01

标签: ios objective-c

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

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

这是什么意思?

2 个答案:

答案 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