gpt4 book ai didi

ios - String.anotherIndex 导致 "fatal error: cannot increment endIndex"

转载 作者:行者123 更新时间:2023-11-28 12:51:47 24 4
gpt4 key购买 nike

我尝试获取字符串的 startIndex 和另一个索引之间的距离,但在第一个循环迭代中出现以下错误。该代码实际上适用于大多数字符串,但有些会崩溃。

fatal error: cannot increment endIndex

let content = NSMutableAttributedString(string: rawContent, attributes: attrs)

var startIndex = content.string.characters.startIndex

while true {
let searchRange = startIndex..<rawContent.characters.endIndex
if let range = rawContent.rangeOfString("\n", range: searchRange) {
let index = rawContent.characters.startIndex.distanceTo(range.startIndex)
startIndex = range.startIndex.advancedBy(1)

rawContent.replaceRange(range, with: "*")
content.addAttribute(
NSForegroundColorAttributeName,
value: UIColor.redColor(),
range: NSMakeRange(index, 1))
}
else {
break
}
}

content.replaceCharactersInRange(NSMakeRange(0, content.length), withString: rawContent)

contentNSMutableAttributedString,当应用程序崩溃时,变量具有以下值:

range.startIndex: 164
content.string.characters.startIndex: 0
content.string.characters.endIndex: 437,
content.string.characters.count: 435

我不明白为什么当我尝试计算与 startIndex 的距离时错误消息说增加 endIndex 而 anotherIndex 小于字符串长度。

最佳答案

错误的原因是你在混合Range<String.Index>NSRange蜜蜂。第一个是计数 Character s 和 UTF-16 代码单元中的第二个。如果您开始于:

import Cocoa

let content = NSMutableAttributedString(string: "♥️♥️\n")

... 然后你的代码进入一个无限循环(这是指@Tapani 的原始问题,我没有检查他的更改后是否仍然如此;但核心问题仍然相同)!这是因为:

NSString(string: "♥️♥️\n").length   // 5
"♥️♥️\n".characters.count // 3

...这样您最终用一个空格替换(部分)第二颗心形,将新行留在原处,这反过来又使您处于循环中。

避免这些问题的一种方法是按照以下方式做一些事情:

let content = NSMutableAttributedString(string: "♥️♥️\n")

let newLinesPattern = try! NSRegularExpression(pattern: "\\n", options: [])

let length = (content.string as NSString).length
let fullRange = NSMakeRange(0, length)

let matches = newLinesPattern.matchesInString(content.string, options: [], range: fullRange)

for match in matches.reverse() {
content.replaceCharactersInRange(match.range, withAttributedString: NSAttributedString(string: " "))
}

content.string // "♥️♥️ "

如果您将其复制并粘贴到 playground 中并研究代码(例如,按住 Alt 键并单击方法名称以弹出其 API),您会发现该代码仅适用于 NSRange指标。它也更安全,因为我们反向循环匹配的范围,因此您可以用不同长度的子字符串替换它们。此外,使用 NSRegularExpression使它成为一个更通用的解决方案(另外你可以存储模式并在别处重用它们)。最后,替换为 NSAttributedString , 除了 replaceCharactersInRange正在NSRange基于,还可以让您更好地控制,您可以保留现有属性(从您要替换的范围中获取它们)或添加其他属性...

关于ios - String.anotherIndex 导致 "fatal error: cannot increment endIndex",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36315936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com