Extract Last Word in String with Swift
The other answers are fine if you want to include Foundation classes. If you want to use Swift-only classes then you can do it this way:
One way to do it is to use indices. This is probably the fastest way with long strings:
Swift 4:
let str = "Lorem ipsum dolor sit amet"
let size = str.reversed().firstIndex(of: " ") ?? str.count
let startWord = str.index(str.endIndex, offsetBy: -size)
let last = str[startWord...] // -> "amet"
Or you could split the string:
Swift 4:
let str = "Lorem ipsum dolor sit amet"
let split = str.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 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"
You can use String method enumerateSubstringsInRange. First parameter just pass your string Range<Index>
, and the option .byWords
. Just append each substring to the resulting collection and return it.
Swift 5 or later (for older Swift syntax check edit history)
import Foundation
extension StringProtocol { // for Swift 4 you need to add the constrain `where Index == String.Index`
var byWords: [SubSequence] {
var byWords: [SubSequence] = []
enumerateSubstrings(in: startIndex..., options: .byWords) { _, range, _, _ in
byWords.append(self[range])
}
return byWords
}
}
Usage:
let sentence = "Out of this world!!!"
let words = sentence.byWords // ["Out", "of", "this", "world"]
let firstWord = words.first // "Out"
let lastWord = words.last // world"
let first2Words = words.prefix(2) // ["Out", "of"]
let last2Words = words.suffix(2) // ["this", "world"]
Without import Foundation
Cleaning punctuation characters filtering the letters and spaces of the string
let clean = sentence.filter{ $0.isLetter || $0.isWhitespace }
find the index after the index of the last space in a string
if let lastIndex = clean.lastIndex(of: " "), let index = clean.index(lastIndex, offsetBy: 1, limitedBy: clean.index(before: clean.endIndex)) {
let lastWord = clean[index...]
print(lastWord) // "world"
}
find the index of the first space in a string
if let index = clean.firstIndex(of: " ") {
let firstWord = clean[...index]
print(firstWord) // "Out""
}