Swift或Objective C

时间:2018-08-19 14:56:33

标签: objective-c swift

在Swift或Objective C中,黑白枚举器和迭代器有什么区别?请解释并举例说明枚举器和迭代器。 面试官问我,但我无法解释。枚举是指枚举还是对集合的迭代?

根据我的低估迭代器,对集合执行迭代/循环。例如forEach,for循环,while,while等。但是我不知道什么是枚举器。

2 个答案:

答案 0 :(得分:2)

在编程中两者之间的区别并不总是很大,您会发现单词可以互换使用的情况,但是它们确实描述了不同的东西。您写道:

  

根据我的低估迭代器,对集合执行迭代/循环。例如forEach,for循环,while,while等。但是我不知道什么是枚举器。

迭代的重点只是“迭代/循环”-只需重复一些操作即可,例如牛顿-拉夫森(Newton-Raphson)方法是一种用于近似平方根的迭代算法,通常通过使用循环的编程语言来实现。

枚举列出了所有内容,这就是您的“过度收集”的来源。因此,for / in循环(迭代构造)枚举了一个集合。标准集合都提供返回NSEnumerator对象的枚举器,通常(但并非总是)您会在迭代构造中使用它们来处理集合。

之所以称为枚举类型enum是因为它们列出了所有值,即枚举了它们。

因此,面试官可能一直希望您声明在提供枚举时,语言(forwhile等语言的迭代语句支持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]