Last active
February 23, 2017 22:00
-
-
Save dbonates/852ecd7dc21fb19d504222ba37347f9e to your computer and use it in GitHub Desktop.
String subscript methods
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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