Skip to content

Instantly share code, notes, and snippets.

@dagronf
Created April 6, 2020 06:05
Show Gist options
  • Save dagronf/fefe04a4168c080dcfeb61e5c56320a9 to your computer and use it in GitHub Desktop.
Save dagronf/fefe04a4168c080dcfeb61e5c56320a9 to your computer and use it in GitHub Desktop.
A set of lazy(!) extensions for String to allow index-based indexing
//
// 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