Voici une extension qui vous permettra d'accéder aux limites d'une sous-chaîne en tant que Int
s au lieu de String.Index
valeurs:
import Foundation
extension StringProtocol {
func countableRange<SearchType: StringProtocol>(
of search: SearchType,
options: String.CompareOptions = [],
range: Range<String.Index>? = nil,
locale: Locale? = nil
) -> CountableRange<Int>? {
guard let trueRange = self.range(of: search, options: options, range: range, locale: locale) else {
return nil
}
let intStart = self.distance(from: startIndex, to: trueRange.lowerBound)
let intEnd = self.distance(from: trueRange.lowerBound, to: trueRange.upperBound) + intStart
return Range(uncheckedBounds: (lower: intStart, upper: intEnd))
}
}
Sachez simplement que cela peut conduire à l'étrangeté, c'est pourquoi Apple a choisi de rendre les choses difficiles. (Bien que ce soit une décision de conception discutable - cacher une chose dangereuse en la rendant juste difficile ...)
Vous pouvez en lire plus dans la documentation String d'Apple , mais le tldr est qu'il provient du fait que ces "indices" sont en fait spécifiques à l'implémentation. Ils représentent les indices dans la chaîne après son rendu par le système d'exploitation et peuvent donc passer d'un système d'exploitation à un autre en fonction de la version de la spécification Unicode utilisée. Cela signifie que l'accès aux valeurs par index n'est plus une opération à temps constant, car la spécification UTF doit être exécutée sur les données pour déterminer le bon endroit dans la chaîne. Ces indices ne s'aligneront pas non plus avec les valeurs générées par NSString, si vous y faites un pont, ou avec les indices dans les scalaires UTF sous-jacents. Développeur de mise en garde.