Skip to content

Instantly share code, notes, and snippets.

@DanielCardonaRojas
Last active February 1, 2021 15:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DanielCardonaRojas/f10714497bcca0a25e78ab3010cfce30 to your computer and use it in GitHub Desktop.
Save DanielCardonaRojas/f10714497bcca0a25e78ab3010cfce30 to your computer and use it in GitHub Desktop.
String extensions
import Foundation
// MARK: - Getting substrings
// String API lacks take(while:) and suffix(while:) but has drop(while:) and prefix(while:)
extension String {
func prefix(while predicate: (Unicode.Scalar) -> Bool) -> Substring {
return self.prefix(while: { (c: Character) -> Bool in
return c.unicodeScalars.contains(where: predicate)
})
}
func drop(while predicate: (Unicode.Scalar) -> Bool) -> Substring {
return self.drop(while: { (c: Character) -> Bool in
return c.unicodeScalars.contains(where: predicate)
})
}
func take(while predicate: (Unicode.Scalar) -> Bool ) -> Substring {
return self.prefix(while: predicate)
}
func suffix(while predicate: (Unicode.Scalar) -> Bool) -> Substring {
return self.drop(while: predicate)
}
func split(_ predicate: (Unicode.Scalar) -> Bool) -> (String, String) {
let left = self.take(while: predicate)
let right = self.drop(while: predicate)
return (String(left), String(right))
}
}
extension String {
func padding(with padd: Character, length: Int, toLeft: Bool = true) -> String {
guard self.count < length else {
return String(self.dropLast(self.count - length))
}
let diff = length - self.count
let paddingString = String(repeating: padd, count: diff)
return toLeft ? paddingString + self : self + paddingString
}
}
// Now this extension can be used like this:
let someString = "Daniel10392"
let (l, r) = someString.split({ CharacterSet.letters.contains($0) })
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment