Jak mogę zrobić coś takiego? Weź pierwsze n elementów z tablicy:
newNumbers = numbers[0..n]
Obecnie jest wyświetlany następujący błąd:
error: could not find an overload for 'subscript' that accepts the supplied arguments
EDYTOWAĆ:
Oto funkcja, w której pracuję.
func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
var newNumbers = numbers[0...position]
return newNumbers
}
Slice
anArray
, ale raczej tworzenie nowej tablicy z wycinka. Rzutowanie użyłobyas
operatora:numbers as Array
co spowodowałoby błąd...
zmieniły się na..<
; trzy kropki (wielokropek) pozostały takie same. Dziękuję za przypomnienie; Zaktualizowałem odpowiedź.# 1. Używanie
Array
indeksu dolnego z zakresemDzięki Swift 5, kiedy piszesz…
…
newNumbers
Nie jest typu,Array<Int>
ale jest typuArraySlice<Int>
. Dzieje się tak dlategoArray
, żesubscript(_:)
zwraca wartość,ArraySlice<Element>
która według Apple przedstawia widok na przechowywanie większej tablicy.Poza tym Swift zapewnia
Array
również inicjator o nazwie,init(_:)
który pozwala nam utworzyć nową tablicę zsequence
(w tymArraySlice
).Dlatego możesz użyć
subscript(_:)
withinit(_:)
, aby uzyskać nową tablicę z pierwszych n elementów tablicy:# 2. Korzystanie
Array
zprefix(_:)
metodySwift zapewnia
prefix(_:)
metodę dla typów zgodnych zCollection
protokołem (w tymArray
).prefix(_:)
posiada następującą deklarację:Apple stwierdza również:
Dlatego, jako alternatywa dla poprzedniego przykładu, możesz użyć poniższego kodu, aby utworzyć nową tablicę z pierwszych elementów innej tablicy:
źródło
źródło
Jeszcze jeden wariant z użyciem
extension
i nazwą argumenturange
To rozszerzenie używa
Range
iClosedRange
Testy:
źródło
Funkcjonalny sposób tablicy:
zasięg:
Zaletą tej metody jest to, że taka realizacja jest bezpieczna.
źródło