No Swift, existe uma maneira inteligente de usar os métodos de ordem superior no Array para retornar os 5 primeiros objetos? A maneira obj-c de fazer isso era salvar um índice e fazer um loop for através do índice, incrementando o índice até os 5 anos e retornando o novo array. Existe uma maneira de fazer isso com filter
, map
ou reduce
?
178
n
elementos de umArray
.Respostas:
De longe, a maneira mais pura de obter os primeiros N elementos de uma matriz Swift é usar
prefix(_ maxLength: Int)
:Isso tem o benefício de ser seguro. Se a contagem para a qual você passar
prefix
for maior que a contagem da matriz, ela retornará a matriz inteira.NOTA: como indicado nos comentários,
Array.prefix
na verdade retorna umArraySlice
, não umArray
. Na maioria dos casos, isso não deve fazer diferença, mas se você precisar atribuir o resultado a umArray
tipo ou passá-lo para um método que espera umArray
parâmetro, será necessário forçar o resultado para umArray
tipo:let first5 = Array(someArray.prefix(5))
fonte
dropFirst
edropLast
, portanto, pode tertakeFirst
etakeLast
.first5
ser uma matriz, basta escrever #let first5 = Array(someArray.prefix(5))
video = video.prefix(5)
no Xcode 7.2 resulta em erro de compilaçãoCannot assign value of type 'ArraySlice<Video>' to type '[Video]'
video = Array(video.prefix(5))
prefix
é possivelmente apenas o Swift 2.x (não me lembro se estava no 1.x), mas certamente existe em qualquer sistema operacional que suporte o Swift 2.x, que é o iOS 7 e superior. A disponibilidade do recurso Swift é determinada pelas versões do Swift, não pelas versões do iOS.Atualização: Agora existe a possibilidade de usar
prefix
para obter os primeiros n elementos de uma matriz. Verifique a resposta de @ mluisbrown para obter uma explicação sobre como usar o prefixo.Resposta original: Você pode fazer isso com muita facilidade sem
filter
,map
oureduce
apenas retornando um intervalo de sua matriz:fonte
n
itens de uma matriz Swift, você pode fazer owholeArray.prefix(n)
que tem o benefício adicional de estar seguro. Sen
for maior que o tamanho da matriz,prefix
retornará toda a matriz.wholeArray
não tem mais elementos do quen
prefix
.Com o Swift 5, de acordo com suas necessidades, você pode escolher um dos 6 códigos seguintes do Playground para resolver seu problema.
# 1 Usando
subscript(_:)
subscrito# 2 Usando o
prefix(_:)
métodoComplexidade: O (1) se a coleção estiver em conformidade
RandomAccessCollection
; caso contrário, O ( k ), onde k é o número de elementos a serem selecionados desde o início da coleção.A Apple declara para
prefix(_:)
:# 3 Usando o
prefix(upTo:)
métodoComplexidade: O (1)
A Apple declara para
prefix(upTo:)
:# 4 Usando o
prefix(through:)
método# 5 Usando o
removeSubrange(_:)
métodoComplexidade: O ( n ), em que n é o comprimento da coleção.
# 6 Usando o
dropLast(_:)
métodoComplexidade: O (1) se a coleção estiver em conformidade
RandomAccessCollection
; caso contrário, O ( k ), onde k é o número de elementos a serem descartados.fonte
fonte
SWIFT 4
Uma solução diferente:
Uma solução em linha fácil que não trava se o seu array for muito curto
Mas funciona bem com isso.
Normalmente, isso falharia se você fizesse isso:
fonte
[0,1,2,3,4,5].enumerated().flatMap{ $0.offset < 1000 ? $0.element : nil }
Para obter os 5 primeiros elementos de uma matriz, tudo o que você precisa fazer é dividir a matriz em questão. Na Swift, você fazê-lo como este:
array[0..<5]
.Para tornar a escolha dos N primeiros elementos de uma matriz um pouco mais funcional e generalizável, você pode criar um método de extensão para fazê-lo. Por exemplo:
fonte
Alterei levemente a resposta de Markus para atualizá-la para a versão mais recente do Swift, pois
var
dentro da sua declaração de método não há mais suporte:fonte
Swift 4
Para obter os primeiros N elementos de uma matriz Swift, você pode usar
prefix(_ maxLength: Int)
:fonte
Swift 4 com salvando tipos de array
fonte
Atualização para o swift 4:
Para o rápido 3:
fonte
Plain & Simple
fonte
Para uma matriz de objetos, você pode criar uma extensão a partir de Sequência.
Uso:
fonte