web-dev-qa-db-fra.com

Littéraux objectifs C pour NSSet et NSOrderedSet?

Le cas échéant, quelles opérations NSSet et NSOrderedSet peut-on effectuer avec les nouveaux littéraux de collection Objective-C?

Pour NSArray, NSDictionary et NSNumber, voir ici .

FWIW, ce Big Nerd Ranch Post dit que la syntaxe d'indexation est censée fonctionner pour NSOrderedSet. Mais dans mes tests, ce n'est pas le cas. Et je n'ai rien trouvé sur la création d'ensembles ordonnés.

45
William Jockusch

Il n'y a pas de syntaxe littérale Objective-C pour NSSet. Il n'est pas vraiment judicieux d'utiliser l'indexation d'index pour accéder aux éléments NSSet, bien que l'indexation basée sur les clés puisse le faire. Soit en enveloppant ou en sous-classant, vous pourriez ajouter le vôtre.

(Correction): À l'origine, je pensais que NSOrderedSet n'était pas non plus pris en charge, mais il s'avère que l'utilisation de l'indexation d'index est prise en charge, mais il ne semble pas pour être un moyen d'initialiser un NSOrderedSet avec la syntaxe littérale. Cependant, vous pouvez utiliser initWithArray: et passer un tableau littéral:

NSMutableOrderedSet* oset = [[NSMutableOrderedSet alloc] initWithArray: 
    @[@"a", @"b", @"c", @"d", @42]];

oset[2] = @3;
NSLog(@"OrderedSet: %@", oset);

Les sorties:

OrderedSet: {(
    a,
    b,
    3,
    d,
    42
)}

Selon cet excellent article par Mike Ash, vous pouvez ajouter les méthodes utilisées pour prendre en charge l'indexation indexée dans vos propres objets.

- (id)objectAtIndexedSubscript:(NSUInteger)index;
- (void)setObject: (id)obj atIndexedSubscript: (NSUInteger)index;

Et des méthodes similaires pour la clé basée sur les objets:

- (id)objectForKeyedSubscript: (id)key;
- (void)setObject: (id)obj forKeyedSubscript: (id)key;

Ainsi, vous pouvez implémenter un wrapper (ou avec un peu plus de travail, le sous-classer) autour d'un NSSet et fournir une récupération basée sur les clés. Cool!

46
mvl

Qu'en est-il d'essayer, en cas de NSSet:

#define $(...)  [NSSet setWithObjects:__VA_ARGS__, nil]

Et en l'utilisant comme ceci:

NSSet *addresses = $(addr1,addr2,addr3,addr4);

;-)

39
Devarshi