How do I get the string before a certain character in swift? The code below is how I did it in Objective C, but can\'t seem to perform the same task in Swift. Any tips or su
Use componentsSeparatedByString() as shown below:
var delimiter = " "
var newstr = "token0 token1 token2 token3"
var token = newstr.components(separatedBy: delimiter)
print (token[0])
Or to use your specific case:
var delimiter = " token1"
var newstr = "token0 token1 token2 token3"
var token = newstr.components(separatedBy: delimiter)
print (token[0])
Swift 5 extensions
extension String {
func stringBefore(_ delimiter: Character) -> String {
if let index = firstIndex(of: delimiter) {
return String(prefix(upTo: index))
} else {
return ""
}
}
func stringAfter(_ delimiter: Character) -> String {
if let index = firstIndex(of: delimiter) {
return String(suffix(from: index).dropFirst())
} else {
return ""
}
}
}
let str = "n1:lolz"
print(str.stringBefore(":")) // n1
print(str.stringAfter(":")) // lolz
let str = "n1:"
print(str.stringBefore(":")) // n1
print(str.stringAfter(":")) // empty string
let str = "n1+lolz"
print(str.stringBefore(":")) // empty string
print(str.stringAfter(":")) // empty string
This should be fine tuned for your needs and edge cases.
To mutate a String into the part until the first appearance of a specified String you could extend String like this:
extension String {
mutating func until(_ string: String) {
let components = self.components(separatedBy: string)
self = components[0]
}
}
This can be called like this then:
var foo = "Hello Swift"
foo.until(" Swift") // foo is now "Hello"
You could use the method prefix(upTo:) in Swift 4 or above
var string = "hello Swift"
if let index = string.firstIndex(of: " ") {
let firstPart = string.prefix(upTo: index)
print(firstPart) // print hello
}
My 2 cents :-) using Swift 3.0, similar to PHP strstr
extension String {
func strstr(needle: String, beforeNeedle: Bool = false) -> String? {
guard let range = self.range(of: needle) else { return nil }
if beforeNeedle {
return self.substring(to: range.lowerBound)
}
return self.substring(from: range.upperBound)
}
}
Usage1
"Hello, World!".strstr(needle: ",", beforeNeedle: true) // returns Hello
Usage2
"Hello, World!".strstr(needle: " ") // returns World!
Following up on Syed Tariq's answer: If you only want the string before the delimiter (otherwise, you receive an array [String]):
var token = newstr.components(separatedBy: delimiter).first