Qual è il modo di estrarre l'ultima parola in una stringa in Swift? Quindi se ho "Lorem ipsum dolor sit amet", ritorna "amet". Qual è il modo più efficace per farlo?Estrai l'ultima parola in stringa con Swift
risposta
È possibile utilizzare il metodo String enumerateSubstringsInRange. Il primo parametro passa semplicemente i caratteri String.indices e l'opzione .ByWords. Basta aggiungere ciascuna sottostringa alla matrice finale e restituirla.
Xcode 8.1 • Swift 3.0.1 o successivo
extension String {
var byWords: [String] {
var byWords:[String] = []
enumerateSubstrings(in: startIndex..<endIndex, options: .byWords) {
guard let word = $0 else { return }
print($1,$2,$3)
byWords.append(word)
}
return byWords
}
func firstWords(_ max: Int) -> [String] {
return Array(byWords.prefix(max))
}
var firstWord: String {
return byWords.first ?? ""
}
func lastWords(_ max: Int) -> [String] {
return Array(byWords.suffix(max))
}
var lastWord: String {
return byWords.last ?? ""
}
}
Usage:
let sentence = "Out of this world!!!"
let firstWord = sentence.firstWord // "Out"
let lastWord = sentence.lastWord // world"
let words = sentence.byWords // ["Out", "of", "this", "world"]
let first2Words = sentence.firstWords(2) // ["Out", "of"]
let last2Words = sentence.lastWords(2) // ["this", "world"]
Swift 2
extension String {
var byWords: [String] {
var result:[String] = []
enumerateSubstringsInRange(characters.indices, options: .ByWords) {
guard let substring = $0.substring else { return }
result.append(substring)
}
return result
}
}
Primo utilizzo componentsSeparatedByString
di dividere la stringa in un array dallo spazio, quindi ottenere l'ultima parola della matrice utilizzando .last
var string = "Lorem ipsum dolor sit amet"
var stringArr = string.componentsSeparatedByString(" ")
var lastWord = stringArr.last //amet
Vorrei anche considerare l'utilizzo di componentsSeparatedByCharactersInSet
, e utilizzando il set di caratteri spazio bianco:
let string = "Lorem ipsum dolor sit amet"
let stringArray = string.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
print(stringArray.last)
Mi piace il tuo approccio! Molte grazie! È possibile ottenere le ultime due parole con questo approccio o dovrei usare un ciclo for? – senty
Non dimenticare di aggiungere 'import Foundation' alla risposta. L'esempio non funzionerà senza di esso. – ColGraff
Funziona per me senza 'import Foundation':/ – senty
Le altre risposte vanno bene se si desidera includere le classi Foundation. Se si desidera utilizzare Swift-solo le classi allora si può fare in questo modo:
Swift 3:
let str = "Lorem ipsum dolor sit amet"
let split = str.characters.split(separator: " ")
let last = String(split.suffix(1).joined(separator: [" "]))
let lastTwo = String(split.suffix(2).joined(separator: [" "]))
print(last) // -> "amet"
print(lastTwo) // -> "sit amet”
Swift 2:
let str = "Lorem ipsum dolor sit amet"
let split = str.characters.split(Character(" "))
let last = String(split.suffix(1).joinWithSeparator([" "]))
let lastTwo = String(split.suffix(2).joinWithSeparator([" "]))
print(last) // -> "amet"
print(lastTwo) // -> "sit amet"
Enormi ringraziamenti !! Penso che la risposta dovrebbe essere accettata. – senty