【问题标题】:How to modify string element of a NSArray using fast enumeration? [duplicate]如何使用快速枚举修改 NSArray 的字符串元素? [复制]
【发布时间】:2014-05-15 12:21:30
【问题描述】:

任何人都可以建议如何使用快速枚举对 NSArray 的元素进行字符串化。使用普通的 for 循环很容易做到这一点。下面的代码工作正常

_tempArray = [[NSMutableArray alloc] initWithObjects:@"A",@"B",@"C",@"D",@"E",@"F", nil];

NSUInteger i=0;
for (; i<[_tempArray count]; i++) {
     if ([[_tempArray objectAtIndex:i] isEqualToString:@"A"]) {
            [_tempArray replaceObjectAtIndex:i withObject:@"a"];
      }
}

我想和上面的代码一样做快速枚举。我尝试了下面的代码但它给出了*****Error:Collection <__nsarraym:> was mutated while being enumerated.******,这意味着枚举时无法修改集合。任何人都可以提出任何方法来实现它。**

NSUInteger j=0;
    for (NSString *temp in _tempArray) {
        if ([temp isEqualToString:@"A"]) {
            [_tempArray replaceObjectAtIndex:j withObject:@"a"];
        }
        j++;
    }

【问题讨论】:

  • 有效的代码有什么问题?你的最终目标是什么?
  • 也许你想用lowercaseString
  • @Wain 因为它比普通的 for 循环更快
  • 您需要担心的迭代有多大(以及每次迭代完成的工作量有多大)?您已进行分析以证明这对您来说是一个瓶颈?
  • 这是过早的优化——不要这样做。以最简洁、最简单、最清晰的方式编写代码以理解这一点是可能的。然后,如果出现问题,请使用分析器工具找出真正的性能问题并进行修复。

标签: ios objective-c cocoa-touch cocoa nsarray


【解决方案1】:

如何使用快速枚举修改 NSArray 的字符串元素?

不要。您不应该在枚举期间修改数组。这不是一个任意的限制——这样做可能会导致逻辑错误。

如果要修改/转换数组,请改用显式索引的 for 循环。

【讨论】:

  • 您不应该在枚举期间修改数组元素。错误。您可以在枚举期间更改数组中的任何对象,只要您不更改数组本身。并且您也不应该在循环期间更改数组,因为可能会出现相同的后果。
  • @vikingosegundo 实际上,我的意思是不应该修改数组的结构,我的措辞令人困惑,已修复。至于您的第二条评论:不,如果您保留明确的索引并跟踪数组大小,并注意正确使用的索引(快速枚举无法做到的事情),那么修改它是非常好的数组。例如,您还如何实现排序算法?
  • 线程环境中可能会出现问题。我会列举一个副本,在那里改变原来的。一种变体:反向枚举。
【解决方案2】:

您可以使用数组索引语法收紧代码:

for (int i=0; i<_tempArray.count; i++) {
    if ([_tempArray[i] isEqualToString:@"A"]) {
        _tempArray[i] = @"a";
    }
}

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多