Есть ли функция, которую я могу использовать для итерации по массиву и иметь индекс и элемент, как перечисление Python?
for index, element in enumerate(list):
...
arrays
swift
enumeration
thinker3
источник
источник
enumerate
?enumerating
для Swift 4. Волнующий!for (index, element) in
при использованииenumerated
вводит в заблуждение. должно бытьfor (offset, element) in
Swift 5 предоставляет метод
enumerated()
для вызоваArray
.enumerated()
имеет следующую декларацию:В простейших случаях вы можете использовать
enumerated()
цикл for. Например:Обратите внимание, что вы не ограничены использованием
enumerated()
цикла for. Фактически, если вы планируете использоватьenumerated()
цикл for для чего-то похожего на следующий код, вы делаете это неправильно:Более быстрый способ сделать это:
В качестве альтернативы вы также можете использовать
enumerated()
сmap
:Более того, хотя он имеет некоторые ограничения , он
forEach
может быть хорошей заменой цикла for:Используя
enumerated()
иmakeIterator()
, вы даже можете выполнять итерации вручнуюArray
. Например:источник
enumerate
?Начиная с Swift 2, функция enumerate должна вызываться для коллекции следующим образом:
источник
Я нашел этот ответ, когда искал способ сделать это с помощью словаря , и оказалось, что его довольно легко адаптировать, просто передавая кортеж для элемента.
источник
Вы можете просто использовать цикл перечисления, чтобы получить желаемый результат:
Свифт 2:
Свифт 3 и 4:
Или вы можете просто пройти через цикл for, чтобы получить тот же результат:
Надеюсь, поможет.
источник
Основной перечислять
или со Swift 3 ...
Перечислять, фильтровать и отображать
Однако я чаще всего использую перечисление в сочетании с картой или фильтром. Например, при работе с парой массивов.
В этом массиве я хотел отфильтровать нечетные или даже проиндексированные элементы и преобразовать их из Ints в Double. Так
enumerate()
получает индексировать и элемент, а затем проверяет фильтр индекса, и , наконец , избавиться от результирующего набора Я сопоставляет его только элемент.источник
Использование
.enumerate()
работает, но оно не обеспечивает истинный индекс элемента; он предоставляет только Int, начинающийся с 0 и увеличивающийся на 1 для каждого последующего элемента. Это обычно не имеет значения, но есть вероятность неожиданного поведения при использовании сArraySlice
типом. Возьмите следующий код:Это несколько надуманный пример, и на практике это не распространенная проблема, но все же я думаю, что стоит знать, что это может произойти.
источник
it does not actually provide the true index of the element; it only provides an Int beginning with 0 and incrementing by 1 for each successive element
Да, именно поэтому он называется перечислять . Кроме того, срез не является массивом, поэтому неудивительно, что он ведет себя по-другому. Здесь нет ошибки - все по дизайну. :)filter
сначала?Начиная с Swift 3, это
источник
Для полноты вы можете просто перебрать индексы вашего массива и использовать индекс для доступа к элементу по соответствующему индексу:
Использование forEach
Используя
enumerated()
метод сбора . Обратите внимание, что он возвращает коллекцию кортежей сoffset
иelement
:используя forEach:
Те будут печатать
Если вам нужен индекс массива (не смещение) и его элемент, вы можете расширить коллекцию и создать свой собственный метод для получения индексированных элементов:
Другая возможная реализация, предложенная Алексом, заключается в архивировании индексов коллекции с ее элементами:
Тестирование:
Это будет
источник
enumeratedIndices
, повторяя сzip(self.indices, self)
for element in zip(indices, self) { try body(element) }
. Кстати, мне не нравится название, которое я выбрал,indexedElements
может лучше описать, что он делаетfor
петля работает, но такжеzip(self.indices, self) .forEach(body)
forEach
делает цикл за кадром. Я предпочитаю, чтобы все было просто: github.com/apple/swift/blob/master/stdlib/public/core/…@inlinable public func forEach( _ body: (Element) throws -> Void ) rethrows { for element in self { try body(element) } } }
Это формула цикла перечисления:
Для более подробной информации вы можете проверить здесь .
источник
Я лично предпочитаю использовать
forEach
метод:Вы также можете использовать короткую версию:
источник
Xcode 8 и Swift 3: массив можно перечислить с помощью
tempArray.enumerated()
Пример:
приставка:
источник
Для тех, кто хочет использовать
forEach
.Swift 4
Или
источник
Для того, что вы хотите сделать, вы должны использовать
enumerated()
метод в вашем массиве :источник
Мы вызвали функцию перечисления для реализации этого. подобно
источник