【问题标题】:Setting up a NSDictonary with NSSet objects使用 NSSet 对象设置 NSDictionary
【发布时间】:2012-11-18 19:08:55
【问题描述】:

有没有办法在一个命令中使用 NSSet 对象设置 NSSDictionary?或者,是否需要首先为所有集合创建对象?

例如,这样的事情可能吗?

NSDictionary *dictionary=[NSDictionary dictionaryWithObjectsAndKeys:{@"orange",@"lemon"},@"citrus",{@"horse",@"moose",@"goose"},@"animals",nil];

感谢阅读。

【问题讨论】:

  • 不确定该通用方案是否合法,但如果是,则它是倒退的——在 ObjectsAndKeys 列表中首先是对象,其次是键。

标签: objective-c nsdictionary nsset


【解决方案1】:

没有 NSSet 文字,没有。但是你可以使用一个 NSArray 文字来初始化一个 NSSet……它是你能得到的最短的:

NSDictionary *dictionary = @{
    @"citrus":  [NSSet setWithArray:@[@"orange", @"lemon"]],
    @"animals": [NSSet setWithArray:@[@"horse", @"moose", @"goose"]]};

【讨论】:

  • 使用[NSSet setWithObjects:@"orange", @"lemon", nil] 可能比这更好。这样您就不会无缘无故地创建和销毁数组。
  • 有一些权衡,比如不得不担心正确的 nil 终止。除非性能是一个问题,否则我宁愿选择更难搞砸的方法。
  • 如果您没有正确地 nil 终止参数列表,编译器会立即通知您。每次运行程序时,使用 +[NSSet setWithArray:] 都会对运行时产生影响。 +[NSSet setWithObjects:] 是一种更常见的模式。
  • 如果您的参数之一意外为零,例如如果它是方法或函数调用的结果,编译器不会警告您,从而过早终止您的列表。这是一个非常隐蔽的错误,虽然幸运的是相当罕见。
  • 啊,原来如此。不过,在这种情况下,由于所有元素都是文字,我认为使用 setWithObjects 是安全的。
【解决方案2】:

Objective-C 中没有 NSSet 文字,只有 NSArray 文字。

NSDictionary *dictionary = @{ @"citrus" : @[ @"orange", @"lemon" ], @"animals" : @[ @"horse", @"moose" ,@"goose" ] };

所以上面会给你一个NSDictionary,一个NSArray包含orangelemon作为键citrus,一个NSArray包含horsemoosegoose为密钥animals

你可以像这样访问那些NSArrays dictionary[@"animals"] and dictionary[@"citrus"]

你也可以嵌套这些文字访问器 dictionary[@"animals"][0] 会给你horse

甚至使用数组方法

[dictionary[@"citrus"] count] 会给你2

【讨论】:

  • 感谢您解释所有这些快捷方式,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多