Jaki jest sposób wydobywania ostatniego słowa w ciągu znaków w Swift? Więc jeśli mam "Lorem ipsum dolor sit amet", zwróć "amet". Jaki jest najskuteczniejszy sposób na zrobienie tego?Wyodrębnij ostatnie słowo w ciągu z Swiftem
Odpowiedz
Można użyć metody String enumerateSubstringsInRange. Pierwszy parametr po prostu przekazuj swoje ciągi znaków. Index i opcję .ByWords. Po prostu dołącz każdy podciąg do ostatecznej tablicy i zwróć go.
Xcode 8,1 • Swift 3.0.1 lub później
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 ?? ""
}
}
Zastosowanie:
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
}
}
Pierwsze użycie componentsSeparatedByString
podzielić swój ciąg do tablicy przez przestrzeń, a następnie dostać ostatnie słowo tablicy używając .last
var string = "Lorem ipsum dolor sit amet"
var stringArr = string.componentsSeparatedByString(" ")
var lastWord = stringArr.last //amet
Chciałbym również rozważyć użycie componentsSeparatedByCharactersInSet
, a przy użyciu zestawu znaków białymi:
let string = "Lorem ipsum dolor sit amet"
let stringArray = string.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
print(stringArray.last)
Podoba mi się Twoje podejście! Wielkie dzięki! Czy można uzyskać dwa ostatnie słowa z tym podejściem, czy też powinienem użyć pętli for? – senty
Nie zapomnij dodać do odpowiedzi 'import Foundation'. Przykład nie zadziała bez niego. – ColGraff
To działa dla mnie bez 'import Foundation':/ – senty
Inne odpowiedzi są w porządku, jeśli chcesz uwzględnić klasy Foundation. Jeśli chcesz użyć SWIFT-tylko klasy następnie można to zrobić w ten sposób:
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"
Ogromne dzięki! Myślę, że ta odpowiedź powinna być akceptowana. – senty