我剛剛下載FourInARow從2015 WWDC樣本代碼(https://developer.apple.com/sample-code/wwdc/2015/)和注意到文件AAPLViewController.m
奇數屬性聲明的語法包含角括號<>
@property NSArray<NSMutableArray<CAShapeLayer *> *> *chipLayers;
奇數屬性聲明是什麼意思?
我剛剛下載FourInARow從2015 WWDC樣本代碼(https://developer.apple.com/sample-code/wwdc/2015/)和注意到文件AAPLViewController.m
奇數屬性聲明的語法包含角括號<>
@property NSArray<NSMutableArray<CAShapeLayer *> *> *chipLayers;
奇數屬性聲明是什麼意思?
這是對Objective-C的新增加,名爲Lightweight Generics。它是在iOS9/OS X 10.11中引入的,目的是爲了增強Swift和Objective-C之間的互操作性。由於文件說:
使用輕量級通用參數的NSArray,NSSet中和NSDictionary的類型 的Objective-C的聲明由斯威夫特有關其內容保存類型 信息導入。
例如,請考慮下面的Objective-C的屬性聲明:
@property NSArray<NSDate *>* dates;
@property NSSet<NSString *>* words;
@property NSDictionary<KeyType: NSURL *, NSData *>* cachedData;
這裏是斯威夫特如何導入它們:
var dates: [NSDate]
var words: Set<String>
var cachedData: [NSURL: NSData]
除了米哈爾Ciuba的回答是:
儘管如此文檔(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
超類如何符合其子類?你不是那個意思嗎? – Honey
@ asma22這就是編譯器發出警告時的情況,因爲它是錯誤的。 – mojuba
但是你正在接受'CALayer',它是'CAShapeLayer'的超類,它沒有全部的'CAShapeLayer'對象。 'CAShapeLayer'是要符合的子類。在你的評論中,你說*好的,因爲CALayer是CAShapeLayer *的超類。應該是這樣的。 * OK,因爲CALayer是CAShapeLayer的**子類** * – Honey