web-dev-qa-db-fra.com

swift 3 get start index (en tant qu'int) de sous-chaîne

Je voudrais obtenir la position de début et de fin d'une sous-chaîne dans une chaîne. Exemple: dans la chaîne "salut c'est mon nom"; Si je fournis la chaîne "this", j'aimerais savoir que l'indice de début est 4 et que l'indice de fin est 7.

J'ai trouvé plusieurs liens, dont celui-ci:

Swift: obtient l'index du début d'une sous-chaîne dans une chaîne Une-sous-chaîne-dans-une-chaîne

Mais cela ne fonctionne pas dans Swift 3 car la méthode s’appelle désormais range.

J'utilise maintenant ceci:

let range = mystring.range(of: "StringSearch")?.lowerBound

qui retourne cette

Swift.String.UnicodeScalarView.Index(_position: 15), _countUTF16: 1))

Et je ne peux pas obtenir la position en tant qu'entier car il s'agit d'un index.

En résumé, je voudrais avoir dans une variable de type int la position, dans ce cas 15.

Quelqu'un peut-il m'aider?

Merci tout le monde.

14
rog

La méthode distance(from:to:) de String calcule la différence Entre deux valeurs String.Index:

let mystring = "hi this is my name"
if let range = mystring.range(of: "this") {
    let startPos = mystring.distance(from: mystring.startIndex, to: range.lowerBound)
    let endPos = mystring.distance(from: mystring.startIndex, to: range.upperBound)
    print(startPos, endPos) // 3 7
}

En fait, il transmet simplement l'appel à la chaîne CharacterView, donc Ci-dessus donne le même résultat que

let mystring = "hi this is my name"
if let range = mystring.range(of: "this") {
    let startPos = mystring.characters.distance(from: mystring.characters.startIndex, to: range.lowerBound)
    let endPos = mystring.characters.distance(from: mystring.characters.startIndex, to: range.upperBound)
    print(startPos, endPos) // 3 7
}

Si vous avez besoin de tous occurrences de la chaîne:

let mystring = "this is this and that is that"
var searchPosition = mystring.startIndex
while let range = mystring.range(of: "this", range: searchPosition..<mystring.endIndex) {
    let startPos = mystring.distance(from: mystring.startIndex, to: range.lowerBound)
    let endPos = mystring.distance(from: mystring.startIndex, to: range.upperBound)
    print(startPos, endPos)

    searchPosition = range.upperBound
}
19
Martin R

La réponse adaptée de Martin R dans une fonction vous donne la première occurrence sous la forme d'une NSRange. Vous pouvez aussi transformer ceci en une extension de String.

public class func indexOf(string: String, substring: String) -> NSRange? {
    if let range = string.range(of: substring) {
        let startPos = string.distance(from: string.startIndex, to: range.lowerBound)
        return NSMakeRange(startPos, substring.count)
    }
}
1
GabeV