web-dev-qa-db-fra.com

Nouveau tableau à partir de la plage d'indexation Swift

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
}
104
Charlie Egan

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]
162
Cezary Wojcik

#1. Utilisation de Array indice avec range

Avec 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 Arraysubscript(_:​) 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]

# 2. Utilisation de la méthode 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]
82
Imanou Petit
func subArray<T>(array: [T], range: NSRange) -> [T] {
  if range.location > array.count {
    return []
  }
  return Array(array[range.location..<min(range.length, array.count)])
}
5
Phil