With the following function I sometime get "Thread 1: Fatal error: String index is out of bounds" errors at the substring.shuffled() call.
func transform(_ text: String) -> String {
var transformed = text
if #available(macOS 10.14, iOS 12.0, *) {
print("text: \"\(text)\"")
var wordRanges: [Range<String.Index>] = []
let tokenizer = NLTokenizer(unit: .word)
tokenizer.string = transformed
tokenizer.enumerateTokens(in: transformed.startIndex..<transformed.endIndex) { range, _ in
if transformed[range].count > 3 {
let subrange = transformed.index(range.lowerBound, offsetBy: 1)..<transformed.index(range.upperBound, offsetBy: -1)
wordRanges.append(subrange)
}
return true
}
wordRanges.reversed().forEach { range in
let substring = String(transformed[range])
print("substring: \"\(substring)\"")
transformed.replaceSubrange(range, with: substring.shuffled())
}
} else {
let range = NSRange(transformed.startIndex..., in: transformed)
let regex = try! NSRegularExpression(pattern: "\\W?\\w(\\w+)\\w\\W?", options: [])
let matches = regex.matches(in: transformed, options: [], range: range)
matches.reversed().forEach { match in
guard let subrange = Range(match.range(at: 1), in: transformed) else {
return
}
let substring = transformed[subrange]
transformed.replaceSubrange(subrange, with: substring.shuffled())
}
}
return transformed
}
The error appear in a macOS app with some strings but not all. I can't reproduce the error in a playground with the string that triggered the error.
When the error occurs, tprinted substrings are not correct.
Using Xcode 13.3.