Int64 для перечислимых циклов

#swift

#swift

Вопрос:

Если я использую array.enumerated , я могу перебирать индексы int. Но

for (intIndex, actionElement) in actionElements.enumerated()

Но что, если я хочу использовать Int64 вместо Int? Каков наилучший синтаксис этого? Кстати, в настоящее время я просто использую это: let index = Int64(intIndex)

Комментарии:

1.Вы Int работаете Int64 на 64-разрядных машинах?

2. Я знаю @Sweeper . Тем не менее, эти типы различны.

3. Массивы индексируются Int , так почему имеет смысл перечислять их с Int64 помощью индексов? Вы просто пытаетесь передать индекс какой-либо функции, которая нуждается в Int64 ? В этом случае преобразование с использованием Int64.init (то есть то, что вы делаете) — это нормально.

4. ДА. Но я хочу, чтобы этот код был корректным и для 32-бит. Если компилятор говорит: «они разные», я хочу, чтобы приведение было правильным для каждой платформы

5. Int32.max есть 4.294.967.295 . Содержат ли ваши массивы больше элементов? Если нет Int , работает точно так же на 32- и 64-разрядных машинах. Нет причин использовать Int64 явно.

Ответ №1:

Сопоставьте типы с тем, какими вы хотите, чтобы они были:

 for (index, actionElement) in actionElements.enumerated().map({(Int64($0), $1)}) { ... }
  

Однако вы говорите, что вам нужны индексы. enumerated не возвращает индексы. Он возвращает смещения. Для массива они совпадают, но это не всегда верно, и это легко превратить в ошибку, если вы сделаете что-то вроде add dropFirst() . Если вам действительно нужны индексы, вы можете заархивировать их таким же образом:

 for (index, actionElement) in zip(actionElements.indices.map(Int64.init), actionElements) { ... }
  

В обоих этих случаях синтаксис становится немного длинным, поэтому я бы разбил его на отдельную переменную или создал вспомогательную функцию, но в любом случае решение будет заключаться в сопоставлении всех значений или их преобразовании при их использовании (как вы сейчас делаете).

Комментарии:

1. ведет ли zip себя как итератор?

2. Я имею в виду, идея хорошая, но она может потреблять много памяти

3. Да, zip — это итератор. Я не уверен, почему вы ожидаете, что это займет много памяти. map создает второй массив, но вы можете добавлять .lazy и удалять его, если ожидаете, что actionElements будет большим (для очень маленьких списков это потенциально может помешать другим оптимизациям). zip не создает второй массив.