Подтвердить что ты не робот

Объективные литералы C для NSSet и NSOrderedSet?

Что, если есть, операции NSSet и NSOrderedSet могут выполняться с новыми литералами коллекции Objective-C?

Для NSArray, NSDictionary и NSNumber см. здесь.

FWIW, это сообщение Big Nerd Ranch Post говорит, что синтаксис индексирования должен работать для NSOrderedSet. Но в моих тестах это не так. И я ничего не мог найти о создании упорядоченных наборов.

4b9b3361

Ответ 1

Нет синтаксиса Objective-C для NSSet. На самом деле не имеет смысла использовать индексирование индексирования для доступа к элементам NSSet, хотя возможно и подписи на основе ключей. Либо путем обертывания, либо подклассификации вы можете добавить свой собственный.

(Коррекция): Первоначально я думал, что NSOrderedSet тоже не поддерживается, но оказывается, что поддержка индексирования индексирования поддерживается, но, похоже, не существует способа инициализации NSOrderedSet с литеральным синтаксисом. Однако вы можете использовать initWithArray: и передать литерал массив:

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

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

Выходы:

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

Согласно этот отличный пост Майка Эша, вы можете добавить методы, которые используются для поддержки индексированных подписчиков на ваши собственные объекты.

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

И аналогичные методы для объектной привязки:

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

Таким образом, вы можете реализовать оболочку (или немного больше работы, подкласс) вокруг NSSet и обеспечить поиск по ключевым словам. Круто!

Ответ 2

Как насчет этого, в случае NSSet:

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

И используя его вот так:

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

; -)