Files
Woka_Native_iOS/WOKA/Helpers/StringSubScript.swift
2024-05-02 13:20:40 +05:30

58 lines
2.0 KiB
Swift

//
// StringSubScript.swift
// WOKA
//
// Created by MacBook Pro on 29/04/24.
//
import Foundation
/*
The first subscript allows you to access an element at a specific offset in the string.
The next two subscripts allow you to get a subsequence using a range (open or closed).
The last three subscripts handle partial ranges, providing a subsequence from the start, up to a specified index, or from a specified index to the end.
*/
import Foundation
extension StringProtocol {
subscript(_ offset: Int) -> Element { self[index(startIndex, offsetBy: offset)] }
subscript(_ range: Range<Int>) -> SubSequence { prefix(range.lowerBound+range.count).suffix(range.count) }
subscript(_ range: ClosedRange<Int>) -> SubSequence { prefix(range.lowerBound+range.count).suffix(range.count) }
subscript(_ range: PartialRangeThrough<Int>) -> SubSequence { prefix(range.upperBound.advanced(by: 1)) }
subscript(_ range: PartialRangeUpTo<Int>) -> SubSequence { prefix(range.upperBound) }
subscript(_ range: PartialRangeFrom<Int>) -> SubSequence { suffix(Swift.max(0, count-range.lowerBound)) }
}
extension LosslessStringConvertible {
var string: String { .init(self) }
}
extension BidirectionalCollection {
subscript(safe offset: Int) -> Element? {
if offset < 0 { return nil }
guard !isEmpty, let i = index(startIndex, offsetBy: offset, limitedBy: index(before: endIndex)) else { return nil }
return self[i]
}
}
/*
let test = "Hello USA 🇺🇸!!! Hello Brazil 🇧🇷!!!"
test[safe: 10] // "🇺🇸"
test[11] // "!"
test[10...] // "🇺🇸!!! Hello Brazil 🇧🇷!!!"
test[10..<12] // "🇺🇸!"
test[10...12] // "🇺🇸!!"
test[...10] // "Hello USA 🇺🇸"
test[..<10] // "Hello USA "
test.first // "H"
test.last // "!"
// Subscripting the Substring
test[...][...3] // "Hell"
// Note that they all return a Substring of the original String.
// To create a new String from a substring
test[10...].string // "🇺🇸!!! Hello Brazil 🇧🇷!!!"
*/