Есть ли в Swift умный способ использования методов более высокого порядка в массиве для возврата 5 первых объектов? Целью obj-c было сохранение индекса и цикл по индексу приращения массива, пока он не достиг 5, и возврат нового массива. Есть ли способ сделать это filter
, map
или reduce
?
179
n
элементыArray
.Ответы:
Безусловно, самый лучший способ получить первые N элементов массива Swift - это использовать
prefix(_ maxLength: Int)
:Это имеет преимущество в том, чтобы быть безопасным. Если счетчик, на который вы передаете,
prefix
больше, чем счетчик массива, он просто возвращает весь массив.ПРИМЕЧАНИЕ: как указано в комментариях,
Array.prefix
фактически возвращаетArraySlice
, а неArray
. В большинстве случаев это не должно иметь значения, но если вам нужно присвоить результатArray
типу или передать его методу, ожидающемуArray
параметр, вам нужно будет принудительно преобразовать результат вArray
тип:let first5 = Array(someArray.prefix(5))
источник
dropFirst
иdropLast
, так же может иметьtakeFirst
иtakeLast
.first5
быть массивом, просто напишитеlet first5 = Array(someArray.prefix(5))
video = video.prefix(5)
в Xcode 7.2 возникает ошибка компиляцииCannot assign value of type 'ArraySlice<Video>' to type '[Video]'
video = Array(video.prefix(5))
prefix
возможно только в Swift 2.x (я не помню, был ли он в 1.x), но он, безусловно, существует в любой ОС, которая поддерживает Swift 2.x, то есть iOS 7 и выше. Доступность функции Swift определяется версиями Swift, а не версиями для iOS.Обновление: теперь есть возможность использовать
prefix
для получения первых n элементов массива. Проверьте ответ @ mluisbrown для объяснения того, как использовать префикс.Оригинал Ответ: Вы можете сделать это очень легко без
filter
,map
илиreduce
, просто возвращает диапазон вашего массива:источник
n
элементы из массива Swift, вы можете сделатьwholeArray.prefix(n)
это с дополнительным преимуществом безопасности границ. Еслиn
больше, чем размер массива,prefix
возвращает весь массив.wholeArray
не будет иметь больше элементов, чемn
prefix
.С Swift 5, в соответствии с вашими потребностями, вы можете выбрать один из 6 следующих кодов игровой площадки , чтобы решить вашу проблему.
# 1. Используя
subscript(_:)
индекс# 2. Используя
prefix(_:)
методСложность: O (1), если коллекция соответствует
RandomAccessCollection
; в противном случае O ( k ), где k - количество элементов, которые нужно выбрать в начале коллекции.Apple заявляет для
prefix(_:)
:# 3. Используя
prefix(upTo:)
методСложность: O (1)
Apple заявляет для
prefix(upTo:)
:# 4. Используя
prefix(through:)
метод# 5. Используя
removeSubrange(_:)
методСложность: O ( n ), где n - длина коллекции.
# 6. Используя
dropLast(_:)
методСложность: O (1), если коллекция соответствует
RandomAccessCollection
; в противном случае O ( k ), где k - количество удаляемых элементов.источник
источник
SWIFT 4
Другое решение:
Простое встроенное решение, которое не вылетит, если ваш массив слишком короткий
Но отлично работает с этим.
Обычно это вылетает, если вы сделали это:
источник
[0,1,2,3,4,5].enumerated().flatMap{ $0.offset < 1000 ? $0.element : nil }
Чтобы получить первые 5 элементов массива, все, что вам нужно сделать, это нарезать нужный массив. В Swift, вы делаете это так:
array[0..<5]
.Чтобы сделать выбор первых N элементов массива более функциональным и обобщенным, вы можете создать метод расширения для этого. Например:
источник
Я немного изменил ответ Маркуса, чтобы обновить его до последней версии Swift, так как
var
внутри вашего объявления метода больше не поддерживается:источник
Swift 4
Чтобы получить первые N элементов массива Swift, вы можете использовать
prefix(_ maxLength: Int)
:источник
Swift 4 с сохранением типов массивов
источник
Обновление для Swift 4:
Для быстрой 3:
источник
Простой и Простой
источник
Для массива объектов вы можете создать расширение из Sequence.
Использование:
источник