【问题标题】:Is there a literal syntax for mutable collections?可变集合有文字语法吗?
【发布时间】:2012-09-14 01:22:40
【问题描述】:

我知道我可以用@[@"foo", @"bar"] 创建一个NSArray,或者用@{@0 : @"foo", @1 : @"bar"} 创建一个NSDictionary

是否有用于创建NSMutableArrayNSMutableDictionary 的文字语法?

【问题讨论】:

  • 只是不要忘记它的NSDictionary *dictionary = @{@"key" : @"value"};,可能会与您编写它的方式混淆。不同于:objectsWithKeys

标签: objective-c cocoa nsmutablearray nsmutabledictionary objective-c-literals


【解决方案1】:

没有内置方式,但我通常像这样使用mutableCopy

NSMutableArray *array = [@[ @"1", @"2", @"3" ] mutableCopy];

【讨论】:

  • 这似乎比[NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil]效率低很多。
  • 或者:“NSMutableArray *array = [NSMutableArray arrayWithArray:@[ @"1", @"2", @"3" ]];" - 虽然我更喜欢你的例子:)
  • NSJSONSerialization中有一个内置方式。
  • @MarkAmery 怎么不那么老套了?文字语法扩展为+[NSArray arrayWithObjects:count:],而不是arrayWithObjects,因此文字语法验证所有项目均非零。
  • 你也可以使用NSMutableArray *array = @[].mutableCopy;,这样看起来更易读。
【解决方案2】:

没有。就像没有用于创建 NSMutableString 的语法一样。可变对象并不特别适合文字值。

【讨论】:

  • 不得不不同意最后一句话。例如,在 Python 中编程,集合是按字面意思创建的,默认情况下是可变的。它可以非常方便。
  • @JoshCaswell:python 甚至有不可变的集合吗?
  • 是的,有一些叫做"tuples" 的东西是不可变的。 > (1, 2, 3) # tuple (immutable array)> [1, 2, 3] # list (mutable array)
  • 如下所示,您执行以下操作NSMutableArray *list = [@[] mutableCopy];,即您在末尾添加 mutableCopy。这就是文字的指定方式
  • @maninvan 这不是文字。这是一个使用文字的表达式。
【解决方案3】:

但是,是否有用于创建 NSMutableArray 或 NSMutableDictionary 的文字语法?

没有。最佳选择:

[@[ @"foo", @"bar"] mutableCopy]

【讨论】:

    【解决方案4】:

    是的。但不完全是。看看这个;

    NSMutableArray *list = [@[] mutableCopy];

    这将创建一个非可变数组@[] 并调用mutableCopy,它返回一个NSMutableArray *。代替@[],你可以给出任何数组字面量。

    【讨论】:

    • 你知道用这个代替速记会引起什么问题吗?
    • @JohnnyRockex 这种语法没有问题,但如果数组一开始就为空,那就很难看;)
    • 我爱我一些速记只是想知道是否有(技术)效果
    【解决方案5】:

    如果您有数组和字典的嵌套文字,您可以通过 NSJSONSerialization 将其转换为完全可变的版本。例如:

    NSArray* array = @[ @{ @"call" : @{ @"devices" : @[ @"$(devices)" ] } } ];
    NSData* data   = [NSJSONSerialization dataWithJSONObject:array 
                                                     options:0 
                                                       error:nil];
    
    NSJSONReadingOptions options = NSJSONReadingMutableContainers | 
                                   NSJSONReadingMutableLeaves;
    NSMutableArray* mutableArray = [NSJSONSerialization JSONObjectWithData:data 
                                                                   options:options
                                                                     error:nil];
    

    有点绕道,但至少不用自己写代码。好在NSJSONSerialization 非常快。

    【讨论】:

    • 呃老兄,JSONKit 更快。通过 5 倍。另外,这太迂回了。只需使用-mutableCopy,然后您可以选择使用-autorelease。
    • @NathanielSymer 加油伙计:两岁的JSONKit 自述文件——顺便说一句,维护得很好——它本身说它只快了 25% - 40%。和-mutableCopy only does a shallow copy。唯一的方法是做一些“迂回”的事情。
    • 你也可以这样做:[[NSMutableArray alloc] initWithArray:@[@"A",@"B"]]。很抱歉投反对票,但序列化和反序列化是疯狂的,并且不适用于多种类型的对象。
    • @kritzikratzi 首先,疯了吗?你举的是一个非常简单的例子,而不是我的例子。请写出@[ @{ @"call" : @{ @"devices" : @[ @"$(devices)" ] } } ],你会发现这是多么疯狂。其次,这适用于@MattDiPasquale 和我的示例中给出的类型。更重要的是,我明确提到这适用于文字。所以请不要道歉!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多