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

Posted

技术标签:

【中文标题】如何使用快速枚举修改 NSArray 的字符串元素? [复制]【英文标题】:How to modify string element of a NSArray using fast enumeration? [duplicate] 【发布时间】: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"];
      

我想和上面的代码一样做快速枚举。我尝试了下面的代码但它给出了*****ErrorCollection <__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 循环更快 您需要担心的迭代有多大(以及每次迭代完成的工作量有多大)?您已进行分析以证明这对您来说是一个瓶颈? 这是过早的优化——不要这样做。以最简洁、最简单、最清晰的方式编写代码以理解这一点是可能的。然后,如果出现问题,请使用分析器工具找出真正的性能问题并进行修复。 【参考方案1】:

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

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

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

【讨论】:

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

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

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

【讨论】:

以上是关于如何使用快速枚举修改 NSArray 的字符串元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中对来自 Core Data 的实体的 NSArray 进行快速枚举时出现运行时错误

如何将 NSArray 元素加入 NSString?

使用包含 NSDictionary 的 NSMutableArray 进行快速枚举

如何通过 for 语句或枚举打印 NSArray 对象? [复制]

for..in遍历,枚举器

NSArray 的第一个元素