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 № 1En 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)]
}
}