Skip to content

Instantly share code, notes, and snippets.

@kmuralidharan91
Last active April 14, 2020 12:59
Show Gist options
  • Save kmuralidharan91/c5468cb0a9535a5416b3a4f3cff08d7c to your computer and use it in GitHub Desktop.
Save kmuralidharan91/c5468cb0a9535a5416b3a4f3cff08d7c to your computer and use it in GitHub Desktop.
StringEndIndex
extension Array where Element == UInt8 {
func stringEndIndex(from startIndex: Int = 0) -> Int? {
findStringEndIndex(from: startIndex)
}
// Method to calculate the end index of string
private func findStringEndIndex(from startIndex: Int, to endIndex: Int? = nil) -> Int? {
guard (endIndex == .none) || (endIndex != nil && endIndex! <= startIndex && endIndex! < count)
else { return nil } // Not a valid string
guard startIndex < count else { return endIndex }
var arraySlice = self[0...startIndex]
guard !arraySlice.contains(where: { 0...31 ~= $0 }) else { return endIndex }
if String(data: Data(arraySlice), encoding: .utf8) != nil {
return findStringEndIndex(from: startIndex + 1, to: startIndex)
}
guard startIndex + 1 < count else { return endIndex }
arraySlice = self[0 ... startIndex + 1]
guard !arraySlice.contains(where: { 0...31 ~= $0 }) else { return endIndex }
if String(data: Data(arraySlice), encoding: .utf8) != nil {
return findStringEndIndex(from: startIndex + 2, to: startIndex + 1)
}
guard startIndex + 3 < count else { return endIndex }
arraySlice = self[0 ... startIndex + 3]
guard !arraySlice.contains(where: { 0...31 ~= $0 }) else { return endIndex }
if String(data: Data(arraySlice), encoding: .utf8) != nil {
return findStringEndIndex(from: startIndex + 4, to: startIndex + 3)
}
return endIndex
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment