Я пытаюсь выполнить итерацию по массиву с помощью enumerateObjectsUsingBlock для извлечения данных. Как использовать enumerateObjectsUsingBlock в Swift? Пожалуйста, помогите мне с примером.
EnumerateObjectsUsingBlock в Swift
Ответ 1
Фонд
enumerateObjectsUsingBlock:
не является методом в массиве, а в NSArray. Если вы хотите использовать его, вам понадобится экземпляр NSArray, а не Array.
import Foundation
var array: NSArray = ["Some", "strings", "in", "an", "array"]
array.enumerateObjectsUsingBlock({ object, index, stop in
//your code
})
если у вас есть существующий массив, вы можете применить swift Array
к NSArray
с помощью as
var cocoaArray = swiftArray as NSArray
или если вы просто import Foundation
, компилятор Swift автоматически скроет ваш массив Swift с NSArray, и все методы NSArray станут доступны вам.
Swift 1
или вы можете просто использовать функцию Swift enumerate
:
for (index, value) in enumerate(array) {
// your code
}
Swift 2
В Swift 2 enumerate
больше не является свободной функцией, теперь она в расширении протокола!
for (index, value) in array.enumerate() {
// your code
}
Swift 3
И в Swift 3, enumerate
был переименован в enumerated
for (index, value) in array.enumerated() {
// your code
}
Ответ 2
Новая функция перечисления возвращает кортеж с индексом и значением, поэтому вы можете получить аналогичную функциональность для 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, поскольку вы можете реплицировать функциональность с помощью вышеуказанного кода.
EDIT: Анонимная функция разбивала мою игровую площадку, поэтому использовалась встроенная функция. Также добавляется использование стоп-переменной для иллюстративных целей.
Ответ 3
Я пишу расширение CollectionType.
Любой способ остановить литерал блока быстрым
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)
}
}