2015-06-09 13 views

risposta

12

È una nuova aggiunta a Objective-C, denominata Lightweight Generics. È stato introdotto in iOS9/OS X 10.11 al fine di migliorare l'interoperabilità tra Swift e Objective-C. Come dice la documentazione:

dichiarazioni Objective-C di NSArray, nsset e NSDictionary tipi utilizzando leggero parametrizzazione generica vengono importati da Swift con informazioni sul tipo del loro contenuto conservato.

Ad esempio, considerare le seguenti dichiarazioni di proprietà Objective-C:

@property NSArray<NSDate *>* dates; 
@property NSSet<NSString *>* words; 
@property NSDictionary<KeyType: NSURL *, NSData *>* cachedData; 

Ecco come Swift li importa:

var dates: [NSDate] 
var words: Set<String> 
var cachedData: [NSURL: NSData] 
2

Oltre alla risposta di Michał Ciuba:

Nonostante ciò la documentazione (Lightweight Generics) non sembra menzionarla esplicitamente, non è solo per Swift: questa sintassi influisce su Objective-C. Se dichiari, ad esempio, una matrice mutabile di CAShapeLayer*, quindi l'aggiunta o l'accesso a elementi incompatibili produrrà avvisi del compilatore. Per esempio.

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

Come può una superclasse conformarsi alla sottoclasse? Non intendi viceversa? – Honey

+0

@ asma22 è esattamente il caso in cui il compilatore emetterà un avviso, perché è sbagliato. – mojuba

+0

Ma stai accettando 'CALayer' che è la superclasse di' CAShapeLayer'. Non ha tutto ciò che ha un oggetto 'CAShapeLayer'. 'CAShapeLayer' è una sottoclasse a cui deve essere conforme. Nel tuo commento hai detto * OK, perché CALayer è una superclasse di CAShapeLayer *. Quale avrebbe dovuto essere qualcosa di simile. * OK, perché CALayer è una ** sottoclasse ** di CAShapeLayer * – Honey

Problemi correlati