在Swift或Objective C中,黑白枚举器和迭代器有什么区别?请解释并举例说明枚举器和迭代器。 面试官问我,但我无法解释。枚举是指枚举还是对集合的迭代?
根据我的低估迭代器,对集合执行迭代/循环。例如forEach,for循环,while,while等。但是我不知道什么是枚举器。
答案 0 :(得分:2)
在编程中两者之间的区别并不总是很大,您会发现单词可以互换使用的情况,但是它们确实描述了不同的东西。您写道:
根据我的低估迭代器,对集合执行迭代/循环。例如forEach,for循环,while,while等。但是我不知道什么是枚举器。
迭代的重点只是“迭代/循环”-只需重复一些操作即可,例如牛顿-拉夫森(Newton-Raphson)方法是一种用于近似平方根的迭代算法,通常通过使用循环的编程语言来实现。
枚举列出了所有内容,这就是您的“过度收集”的来源。因此,for
/ in
循环(迭代构造)枚举了一个集合。标准集合都提供返回NSEnumerator
对象的枚举器,通常(但并非总是)您会在迭代构造中使用它们来处理集合。
之所以称为枚举类型enum
是因为它们列出了所有值,即枚举了它们。
因此,面试官可能一直希望您声明在提供枚举时,语言(for
,while
等语言的迭代语句支持Swift / Objective-C中的迭代)。通过对象/方法依次返回每个项目(例如NSArray
的{{1}})或依次处理每个元素(例如objectEnumerator
的{{1}})的对象/方法。 NSArray
/ enumerateObjectsUsingBlock:
结合了这两者,它是一个迭代构造,直接使用对象枚举器,而不要求程序员直接使用枚举器。
HTH
答案 1 :(得分:0)
我想对上述答案再加一点。 在Obj C中,使用枚举器时,我们无法在循环时更新集合,但可以使用Iterator来完成。
NSMutableArray *arr = [NSMutableArray arrayWithArray:@[@1,@2,@3,@4,@5]];
// Enumeration
for (NSString *st in arr) {
[arr removeObjectAtIndex:1]; *//Error: Collection was mutated while being enumerated.*
}
// Iteration
for (int i=0; i<arr.count; i++) {
[arr removeObjectAtIndex:1];
}
Result:
[1, 3, 4, 5]
[1, 4, 5]
[1, 5]
不推荐使用Swift c样式的for循环,在“ for in”循环中,我们可以更新集合,但它会循环初始数组计数次数
var arr = [1,2,3,4,5,6,7]
for i in arr {
if arr.count > 3 {
arr.remove(at: 3)
}
print(arr)
}
Result:
[1, 2, 3, 5, 6, 7]
[1, 2, 3, 6, 7]
[1, 2, 3, 7]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]