#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
не создает второй массив.