extension String {
var components: [String] {
return self.characters.map { String.init($0) }
}
func componentsSeparated(
separator: String.CharacterView.Generator.Element) -> [String] {
return self.characters.split(separator: separator).map(String.init)
}
func componentsSeparated<T>(
separator: String.CharacterView.Generator.Element,
converter: @noescape (String) -> T?) -> [T] {
return self.componentsSeparated(separator: separator).flatMap { converter($0) }
}
func removedCharacter(character: String.CharacterView.Generator.Element) -> String {
return self.characters
.filter { $0 != character }
.map { String.init($0) }
.joined(separator: "")
}
func indexOfCharacter(character: Character) -> String.Index? {
let index = self.characters.enumerated().filter { (idx, c) in c == character }.first?.0
guard let offset = index else {
return nil
}
return self.index(self.startIndex, offsetBy: offset)
}
func rangeOfString(string: String) -> Range<String.Index>? {
guard let startIndex = self.indexOfCharacter(character: string[string.startIndex]) else {
return nil
}
guard let endIndex = string.index(startIndex, offsetBy: string.characters.count, limitedBy: self.endIndex) else {
return nil
}
let range = startIndex..<endIndex
if self[range] != string {
return nil
}
return range
}
}