48 votes

Littéraux Objective C pour NSSet et NSOrderedSet?

Ce qui, le cas échéant, NSSet et NSOrderedSet opérations peut-on effectuer avec le nouvel Objectif-C collection littéraux?

Pour NSArray, NSDictionary, et NSNumber, voir ici.

FWIW, ce Big Nerd Ranch Post dit l'indexation de la syntaxe est censé travailler pour NSOrderedSet. Mais dans mes tests, il ne le fait pas. Et je n'ai pas été en mesure de trouver quelque chose sur la création d'ensembles ordonnés.

49voto

mvl Points 553

Il n'y a pas d'Objectif-C, la syntaxe littérale pour NSSet. Il n'a pas vraiment le sens de l'utilisation de l'indice de subscripting pour accéder à NSSet éléments, bien que basés sur une clé subscripting pourrait. Soit par l'emballage ou sous-classement, vous peut ajouter votre propre.

(Correction): A l'origine, j'avais pensé NSOrderedSet n'était pas pris en charge, soit, mais il s'avère que l'utilisation de l'indice de subscripting est pris en charge, mais il ne semble pas être un moyen d'initialiser une NSOrderedSet avec la syntaxe littérale. Toutefois, vous pouvez utiliser initWithArray: passer un littéral de tableau:

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

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

Sorties:

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

Selon cet excellent post de Mike Cendres, vous pouvez ajouter les méthodes qui sont utilisées à l'appui indexé subscripting à vos propres objets.

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

Et des méthodes similaires pour objet les incrustations:

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

Ainsi, vous pouvez mettre en œuvre un wrapper (ou avec un peu plus de travail, la sous-classe) autour d'un NSSet et de fournir des clés basé sur la récupération. Cool!

43voto

Miraaj Points 4650

Pourquoi ne pas essayer ceci dans le cas de NSSet:

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

Et l'utiliser comme ça:

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

;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X