web-dev-qa-db-fra.com

Comment obtenir une sous-chaîne avec des gammes spécifiques dans Swift 4?

Ceci utilise l'exemple de code du document officiel Swift4

let greeting = "Hi there! It's Nice to meet you! ????"
let endOfSentence = greeting.index(of: "!")!
let firstSentence = greeting[...endOfSentence]
// firstSentence == "Hi there!"

Mais disons let greeting = "Hello there world!" et je veux ne récupérer que le deuxième mot (sous-chaîne) dans cette phrase? Donc, je ne veux que la Parole "là-bas".

J'ai essayé d'utiliser "world!" comme un argument comme let endOfSentence = greeting.index(of: "world!")! mais Swift 4 Playground n'aime pas ça. Il attend 'Character' et mon argument est une chaîne.

Alors, comment puis-je obtenir une sous-chaîne d'une sous-gamme très précise? Ou trouver nth Word dans une phrase pour une plus grande utilisation dans le futur?

6
Kent Wong

Vous pouvez rechercher des sous-chaînes à l'aide de range(of:).

import Foundation

let greeting = "Hello there world!"

if let endIndex = greeting.range(of: "world!")?.lowerBound {
    print(greeting[..<endIndex])
}

les sorties:

Hello there 

MODIFIER:

Si vous voulez séparer les mots, il y a un moyen rapide et sale et un bon moyen. La façon rapide et sale:

import Foundation

let greeting = "Hello there world!"

let words = greeting.split(separator: " ")

print(words[1])

Et voici la méthode détaillée, qui énumérera tous les mots de la chaîne, peu importe la façon dont ils sont séparés:

import Foundation

let greeting = "Hello there world!"

var words: [String] = []

greeting.enumerateSubstrings(in: greeting.startIndex..<greeting.endIndex, options: .byWords) { substring, _, _, _ in
    if let substring = substring {
        words.append(substring)
    }
}

print(words[1])

EDIT 2: Et si vous essayez simplement d’obtenir les caractères 7 à 11, vous pouvez le faire:

import Foundation

let greeting = "Hello there world!"

let startIndex = greeting.index(greeting.startIndex, offsetBy: 6)
let endIndex = greeting.index(startIndex, offsetBy: 5)

print(greeting[startIndex..<endIndex])
8
Charles Srstka

Pour Swift4,

let string = "substring test"
let start = String.Index(encodedOffset: 0)
let end = String.Index(encodedOffset: 10)
let substring = String(string[start..<end])
15
Kris Roofe

Il y a une erreur dans la première réponse.

Range<String.Index>.upperBound

La propriété upperBound doit être endIndex Par exemple:

let text = "From Here Hello World"
if let result = text.range(of: "Hello World") {
     let startIndex = result.upperBound
     let endIndex = result.lowerBound
     print(String(text[startIndex..<endIndex])) //"Hello World"
}
2
Wade

Les vieilles habitudes ont la vie dure. Je l'ai fait à la manière "Java" et divisé la chaîne par des espaces, puis accédé au deuxième mot.

print(greeting.split(separator: " ")[1]) // "there /n"
0
Kent Wong