Comment puis-je faire quelque chose comme ça? Prenez les n premiers éléments d'un tableau:
newNumbers = numbers[0..n]
Obtenir l'erreur suivante:
error: could not find an overload for 'subscript' that accepts the supplied arguments
MODIFIER:
Voici la fonction dans laquelle je travaille.
func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
var newNumbers = numbers[0...position]
return newNumbers
}
Cela fonctionne pour moi:
var test = [1, 2, 3]
var n = 2
var test2 = test[0..<n]
Votre problème pourrait être avec la façon dont vous déclarez votre tableau pour commencer.
MODIFIER:
Pour corriger votre fonction, vous devez convertir votre Slice
dans un tableau:
func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
var newNumbers = Array(numbers[0..<position])
return newNumbers
}
// test
aFunction([1, 2, 3], 2) // returns [1, 2]
Array
indice avec rangeAvec Swift 5, lorsque vous écrivez…
let newNumbers = numbers[0...position]
… newNumbers
n'est pas de type Array<Int>
mais est de type ArraySlice<Int>
. Cela est dû au fait que Array
subscript(_:)
retourne un ArraySlice<Element>
qui, selon Apple, présente une vue sur le stockage d'un tableau plus grand.
En outre, Swift fournit également Array
un initialiseur appelé init(_:)
qui nous permet de créer un nouveau tableau à partir de sequence
(y compris ArraySlice
) .
Par conséquent, vous pouvez utiliser subscript(_:)
avec init(_:)
afin d’obtenir un nouveau tableau à partir des premiers n éléments d’un tableau:
let array = Array(10...14) // [10, 11, 12, 13, 14]
let arraySlice = array[0..<3] // using Range
//let arraySlice = array[0...2] // using ClosedRange also works
//let arraySlice = array[..<3] // using PartialRangeUpTo also works
//let arraySlice = array[...2] // using PartialRangeThrough also works
let newArray = Array(arraySlice)
print(newArray) // prints [10, 11, 12]
prefix(_:)
de Array
Swift fournit une méthode prefix(_:)
pour les types conformes au protocole Collection
(y compris Array
). prefix(_:)
a la déclaration suivante:
func prefix(_ maxLength: Int) -> ArraySlice<Element>
Renvoie une sous-séquence, de longueur maximale, contenant les éléments initiaux.
Apple déclare également:
Si la longueur maximale dépasse le nombre d'éléments de la collection, le résultat contient tous les éléments de la collection.
Par conséquent, au lieu de l'exemple précédent, vous pouvez utiliser le code suivant pour créer un nouveau tableau à partir des premiers éléments d'un autre tableau:
let array = Array(10...14) // [10, 11, 12, 13, 14]
let arraySlice = array.prefix(3)
let newArray = Array(arraySlice)
print(newArray) // prints [10, 11, 12]
func subArray<T>(array: [T], range: NSRange) -> [T] {
if range.location > array.count {
return []
}
return Array(array[range.location..<min(range.length, array.count)])
}