Skip to content

Instantly share code, notes, and snippets.

@dbonates
Last active February 23, 2017 22:00
Show Gist options
  • Select an option

  • Save dbonates/852ecd7dc21fb19d504222ba37347f9e to your computer and use it in GitHub Desktop.

Select an option

Save dbonates/852ecd7dc21fb19d504222ba37347f9e to your computer and use it in GitHub Desktop.
String subscript methods
import Foundation
protocol Rangeable {
var _lowerBound: Int { get }
var _upperBound: Int { get }
}
extension Int: Rangeable {
var _lowerBound: Int { return self }
var _upperBound: Int { return self + 1 }
}
extension CountableRange: Rangeable {
var _lowerBound: Int { return self.lowerBound as! Int }
var _upperBound: Int { return self.upperBound as! Int }
}
extension CountableClosedRange: Rangeable {
var _lowerBound: Int { return self.lowerBound as! Int }
var _upperBound: Int { return self.upperBound as! Int + 1 }
}
extension String {
func stringIndex(at index: Int) -> String.Index {
return self.index(self.startIndex, offsetBy: index)
}
subscript(element: Rangeable) -> String {
get { return self[stringIndex(at: element._lowerBound)..<stringIndex(at: element._upperBound)] }
set { replaceSubrange(stringIndex(at: element._lowerBound)..<stringIndex(at: element._upperBound), with: newValue) }
}
typealias StringRange = Range<String.Index>
func wordsLoc() -> [StringRange] {
return self.components(separatedBy: .whitespaces).flatMap{self.range(of: $0)}
}
}
// testing
var string = "approachable is better than simple"
for range in string.wordsLoc() {
print(string.substring(with: range))
}
string // "approachable is better than simple"
string[0] // "a"
string[0] = "A" // "A"
print(string) // "Approachable is better than simple"
print(string[0..<8]) // "Approacha"
print(string[0...11]) // "Approachable"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment