/ / Indexation négative rapide dans les tableaux - tableaux, rapide, fondation

Indexation rapide rapide dans les tableaux - tableaux, rapide, fondation

est-ce possible de passer outre L'indexation par défaut du tableau de Swift pour qu'il gère les indices négatifs comme Python?

Par exemple, a[-1] devrait retourner le dernier élément de a, et a[-2] l'élément devant lui.

Cela devrait être possible en étendant la Array tapez, hélas, le code ci-dessous ne fonctionnera pas car il serait en boucle à l'infini:

extension Array {
subscript (index:Int) -> [Element] {
return (index < 0) ? self[self.count+index] : self[index]
}
}

À quel point l'idée de passer outre quelque chose d'aussi fondamental serait-elle mauvaise?

Réponses:

8 pour la réponse № 1

En fait, il existe une méthode Swifty relativement bonne: les arguments étiquetés.

extension CollectionType where Index : BidirectionalIndexType {
subscript(back i: Index.Distance) -> Generator.Element {
return self[endIndex.advancedBy(-i)]
}
}

let ar = [1, 2, 3, 4]
ar[back: 1] // 4
ar[back: 2] // 3

Vous pouvez évidemment changer la sémantique assez facilement. Cette implémentation, par exemple, nécessite que l'index soit supérieur à 0. Le changer pour que 0 renvoie le dernier élément est aussi simple que: self[endIndex.predecessor().advancedBy(-i)], ou, si vous voulez supposer que l'indice est négatif en entrant: self[endIndex.advancedBy(-i)].

L'avantage de l'argument étiqueté est qu'il est clair et que personne ne l'utiliserait par accident.


1 pour la réponse № 2

Swift 3 version:

extension Collection where Index : Comparable {
subscript(back i: IndexDistance) -> Generator.Element {
let backBy = i + 1
return self[self.index(self.endIndex, offsetBy: -backBy)]
}
}