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