NSSet和NSOrderedSet的Objective C文字?

Wil*_*sch 46 literals nsset nsorderedset

NSSet和NSOrderedSet操作可以用新的Objective-C集合文字执行什么(如果有的话)?

对于NSArray,NSDictionary和NSNumber,请参见此处.

FWIW,这个Big Nerd Ranch Post说索引语法应该适用于NSOrderedSet.但在我的测试中却没有.我一直无法找到有关创建有序集的任何内容.

mvl*_*mvl 47

NSSet没有Objective-C文字语法.虽然基于密钥的下标可能会使用索引下标来访问NSSet元素,但这并没有多大意义.通过包装或子类化,您可以添加自己的.

(更正):本来我还以为是NSOrderedSet也不支持,但事实证明,使用索引下标支持的,但似乎没有要与文字语法初始化NSOrderedSet的一种方式.但是,您可以使用initWithArray:并传递文字数组:

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

oset[2] = @3;
NSLog(@"OrderedSet: %@", oset);
Run Code Online (Sandbox Code Playgroud)

输出:

OrderedSet: {(
    a,
    b,
    3,
    d,
    42
)}
Run Code Online (Sandbox Code Playgroud)

根据Mike Ash的这篇优秀文章,您可以添加用于支持索引下标到您自己的对象的方法.

- (id)objectAtIndexedSubscript:(NSUInteger)index;
- (void)setObject: (id)obj atIndexedSubscript: (NSUInteger)index;
Run Code Online (Sandbox Code Playgroud)

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

- (id)objectForKeyedSubscript: (id)key;
- (void)setObject: (id)obj forKeyedSubscript: (id)key;
Run Code Online (Sandbox Code Playgroud)

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

  • 来自@Almo:`NSSet * aset = [NSSet setWithArray:@ [@“ a”,@“ b”,@“ c”,@“ d”,@ 42]];` (2认同)

Dev*_*shi 38

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

#define $(...)  [NSSet setWithObjects:__VA_ARGS__, nil]
Run Code Online (Sandbox Code Playgroud)

并使用它像这样:

NSSet *addresses = $(addr1,addr2,addr3,addr4);
Run Code Online (Sandbox Code Playgroud)

;-)

  • 我更喜欢`[NSSet setWithArray:@ [__ VA_ARGS __]]`这样当有一个`nil`元素而不是默默地停止时它会失败 (22认同)
  • 为了防止将来实现`$(...)`literal,只需使用:`#define set()[NSSet setWithArray:@ [__ VA_ARGS __]]` (6认同)
  • 这个答案和上面的评论都很棒.如果Apple实现了$(...)文字格式,请小心. (3认同)