moaible
6/1/2016 - 2:03 AM

Swift3.0: String Kit

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
    }
}