NSSet和NSOrderedSet的Objective C文字?

时间:2012-08-13 19:15:16

标签: literals nsset nsorderedset

NSSet和NSOrderedSet操作可以使用新的Objective-C集合文字执行什么操作?

对于NSArray,NSDictionary和NSNumber,请参阅here

FWIW,this Big Nerd Ranch Post表示索引语法应该适用于NSOrderedSet。但在我的测试中却没有。我还没有找到任何关于创建有序集合的信息。

2 个答案:

答案 0 :(得分:46)

NSSet没有Objective-C文字语法。虽然基于密钥的下标可能会使用索引下标来访问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
)}

根据Mike Ash的this excellent post,您可以添加用于支持索引下标到您自己的对象的方法。

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

基于对象的键控的类似方法:

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

因此,您可以围绕NSSet实现包装器(或者更多工作,将其子类化)并提供基于密钥的检索。酷!

答案 1 :(得分:38)

在NSSet的情况下尝试这个怎么样:

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

并像这样使用它:

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

- )