我正在尝试使用enumerateObjectsUsingBlock迭代数组以获取数据。 如何在Swift中使用enumerateObjectsUsingBlock?请帮我举个例子。
答案 0 :(得分:55)
enumerateObjectsUsingBlock:
不是Array上的方法,而是NSArray上的方法。如果你想使用它,你需要一个NSArray而不是Array的实例。
import Foundation
var array: NSArray = ["Some", "strings", "in", "an", "array"]
array.enumerateObjectsUsingBlock({ object, index, stop in
//your code
})
如果您有现有数组,则可以使用Array
NSArray
投射到as
var cocoaArray = swiftArray as NSArray
或者如果您只是import Foundation
,Swift编译器会自动将您的Swift数组桥接到NSArray,并且所有NSArray方法都可供您使用。
或者您可以使用Swift的enumerate
功能:
for (index, value) in enumerate(array) {
// your code
}
在Swift 2中,enumerate
不再是免费功能,现在它已经在协议扩展中了!
for (index, value) in array.enumerate() {
// your code
}
在Swift 3中,enumerate
已重命名为enumerated
for (index, value) in array.enumerated() {
// your code
}
答案 1 :(得分:9)
新的枚举函数返回一个带有索引器和值的元组,因此您可以获得与enumerateObjectsUsingBlock类似的功能。
func myBlock (index: Int, value: Int, inout stop: Bool) -> Void {
println("Index: \(index) Value: \(value)")
if index == 3 {
stop = true
}
}
var array = [1,2,3,4,5]
for (index, value) in enumerate(array) {
var stop = false;
myBlock(index, value, &stop)
if stop {
break;
}
}
//Output...
//Index: 0 Value: 1
//Index: 1 Value: 2
//Index: 2 Value: 3
//Index: 3 Value: 4
我想他们没有公开enumerateObjectsUsingBlock,因为您可以使用上面的代码复制功能。
编辑:匿名函数崩溃了我的游乐场,因此使用了内联函数。还使用停止变量添加以用于说明目的。
答案 2 :(得分:1)
我写了CollectionType的扩展名。
Any way to stop a block literal in swift
func forEach(body: ((Self.Generator.Element, Int, inout Bool) -> Void)) {
var stop = false
let enumerate = self.enumerate()
for (index,value) in enumerate {
if stop { break }
body(value,index,&stop)
}
}
答案 3 :(得分:1)
现有答案可以解决问题中提出的问题。 另外,您可以为Array类编写扩展,并添加与-
类似的方法extension Array{
func enumerateObject(_ block : (Any, Int,inout Bool)-> Void){
var stop = false
for (index, aValue) in self.enumerated(){
block(aValue,index,&stop);
}
}
//使用
let numArr = [2,4,7,8,9];
numArr.enumerateObject { (aValue, index, stop) in
let value = aValue as! Int
if !stop{
print("At index \(index) value \(value)");
}
if value == 7{
print(value);
stop = true;
}
}