包含尖括号<>的奇数属性声明语法
我刚刚从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