2015-06-09 50 views

回答

12

這是對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] 
2

除了米哈爾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 
+0

超類如何符合其子類?你不是那個意思嗎? – Honey

+0

@ asma22這就是編譯器發出警告時的情況,因爲它是錯誤的。 – mojuba

+0

但是你正在接受'CALayer',它是'CAShapeLayer'的超類,它沒有全部的'CAShapeLayer'對象。 'CAShapeLayer'是要符合的子類。在你的評論中,你說*好的,因爲CALayer是CAShapeLayer *的超類。應該是這樣的。 * OK,因爲CALayer是CAShapeLayer的**子類** * – Honey