Created
April 6, 2020 06:05
-
-
Save dagronf/fefe04a4168c080dcfeb61e5c56320a9 to your computer and use it in GitHub Desktop.
A set of lazy(!) extensions for String to allow index-based indexing
This file contains 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
// | |
// String+extensions.swift | |
// | |
// Created by Darren Ford on 6/4/20. | |
// | |
// Lazy extensions for Swift Strings indexing | |
// | |
// For example :- | |
// let value = "Caterpillar" | |
// let catStr = value.substring(0 ..< 3) | |
import Foundation | |
extension String { | |
func substring(_ range: Range<Int>) -> String { | |
return String(self[self.range(range)]) | |
} | |
func substring(_ range: PartialRangeFrom<Int>) -> String { | |
return String(self[self.range(range)]) | |
} | |
func substring(_ range: PartialRangeUpTo<Int>) -> String { | |
return String(self[self.range(range)]) | |
} | |
func substring(_ range: PartialRangeThrough<Int>) -> String { | |
return String(self[self.range(range)]) | |
} | |
func range(_ range: Range<Int>) -> Range<String.Index> { | |
let si = self.index(self.startIndex, offsetBy: range.lowerBound) | |
let ei = self.index(self.startIndex, offsetBy: range.upperBound) | |
return si ..< ei | |
} | |
func range(_ range: ClosedRange<Int>) -> ClosedRange<String.Index> { | |
let si = self.index(self.startIndex, offsetBy: range.lowerBound) | |
let ei = self.index(self.startIndex, offsetBy: range.upperBound) | |
return si ... ei | |
} | |
func range(_ partialRange: PartialRangeFrom<Int>) -> Range<String.Index> { | |
let si = self.index(self.startIndex, offsetBy: partialRange.lowerBound) | |
return si ..< self.endIndex | |
} | |
func range(_ partialRange: PartialRangeThrough<Int>) -> Range<String.Index> { | |
let ei = self.index(self.startIndex, offsetBy: partialRange.upperBound + 1) | |
return self.startIndex ..< ei | |
} | |
func range(_ partialRange: PartialRangeUpTo<Int>) -> Range<String.Index> { | |
let ei = self.index(self.startIndex, offsetBy: partialRange.upperBound) | |
return self.startIndex ..< ei | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment