web-dev-qa-db-fra.com

Swift Error: impossible de convertir la valeur du type 'ArraySlice' en type d'argument attendu

Je reçois cette erreur et je suis nouveau à Swift. Je veux prendre les 5 derniers points d'un tableau> = 5 et passer ces 5 points en tant qu'argument de tableau à une fonction. Comment puis-je atteindre cet objectif et surmonter cette erreur?

Impossible de convertir la valeur de type 'ArraySlice' en type d'argument attendu '[CGPoint]'

if (self.points?.count >= 5) {
    let lastFivePoints = self.points![(self.points!.count-5)..<self.points!.count]
    let angle = VectorCalculator.angleWithArrayOfPoints(lastFivePoints)
}
14
chris P

Vous devez convertir ArraySlice en Array en utilisant la méthode Array(Slice<Type>)

if (self.points?.count >= 5) {
    let lastFivePoints = Array(self.points![(self.points!.count-5)..<self.points!.count])
    let angle = VectorCalculator.angleWithArrayOfPoints(lastFivePoints)
}
22
deoKasuhal

Au lieu de l'opérateur de plage, vous pouvez utiliser la méthode prefix (upTo end: Self.Index) qui renvoie ArraySlice, ce qui raccourcit votre code. Définition de la méthode: La méthode renvoie une sous-séquence à partir du début de la collection jusqu'à la position spécifiée (index), sans l'inclure. 

if (self.points?.count >= 5) {
  let lastFivePoints = Array<CGPoint>(self.points?.prefix(upTo:5)) as [AnyObject]
  let angle = VectorCalculator.angleWithArrayOfPoints(lastFivePoints)
}

// You can also do this 

let lastFivePoints = Array<CGPoint>(self.points?[0...4]) 
1
Ohmy

J'ai essayé d'utiliser Array(lastFivePoints) mais j'ai eu une erreur

Le type d'expression est ambigu sans plus de contexte

 enter image description here

J'ai fini par faire:

let arr = lastFivePoints.map({ (x) -> T in
                            return x
                        })

où T est la classe de contenu CGPoint pour cet exemple

0
Ted