Ios String.anotherIndex原因“;致命错误:无法增加endIndex“;
我试图获得字符串的startIndex和另一个索引之间的距离,但在第一次循环迭代中得到以下错误。该代码实际上适用于大多数字符串,但在某些情况下会崩溃 致命错误:无法增加endIndexIos String.anotherIndex原因“;致命错误:无法增加endIndex“;,ios,swift,Ios,Swift,我试图获得字符串的startIndex和另一个索引之间的距离,但在第一次循环迭代中得到以下错误。该代码实际上适用于大多数字符串,但在某些情况下会崩溃 致命错误:无法增加endIndex 我不明白,当我试图计算与startIndex的距离时,为什么错误消息说要增加endIndex,而另一个索引小于字符串长度。您的代码对我来说运行良好,但您应该检查错误。既然您正在搜索整个content.string,为什么还要增加设置搜索范围的复杂性呢 像这样的事情会更简单: if let anotherIndex
我不明白,当我试图计算与startIndex的距离时,为什么错误消息说要增加endIndex,而另一个索引小于字符串长度。您的代码对我来说运行良好,但您应该检查错误。既然您正在搜索整个
content.string
,为什么还要增加设置搜索范围的复杂性呢
像这样的事情会更简单:
if let anotherIndex = content.string.rangeOfString("\n")
{
let index = content.string.startIndex.distanceTo(anotherIndex.startIndex)
}
您的代码对我来说运行良好,但您应该检查错误。既然您正在搜索整个
content.string
,为什么还要增加设置搜索范围的复杂性呢
像这样的事情会更简单:
if let anotherIndex = content.string.rangeOfString("\n")
{
let index = content.string.startIndex.distanceTo(anotherIndex.startIndex)
}
错误的原因是混合了
Range
和NSRange
API。第一种是以字符为单位计数,第二种是以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 // "♥️♥️ "
如果将其复制并粘贴到游乐场并研究代码(例如,Alt单击方法名称以弹出其API),您将看到此代码仅适用于
NSRange
metrics。它也更安全,因为我们正在反向循环匹配的范围,所以您可以用不同长度的子字符串替换它们。此外,使用NSRegularExpression
使其成为更通用的解决方案(此外,您还可以存储模式并在其他地方重用它们)。最后,替换为NSAttributedString
,除了基于NSRange
的replaceCharactersRange
之外,还可以更好地控制现有属性(从要替换的范围中获取)或者添加其他…错误的原因是您混合了Range
和NSRange
API。第一种是以字符为单位计数,第二种是以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 // "♥️♥️ "
如果将其复制并粘贴到游乐场并研究代码(例如,Alt单击方法名称以弹出其API),您将看到此代码仅适用于
NSRange
metrics。它也更安全,因为我们正在反向循环匹配的范围,所以您可以用不同长度的子字符串替换它们。此外,使用NSRegularExpression
使其成为更通用的解决方案(此外,您还可以存储模式并在其他地方重用它们)。最后,替换为NSAttributedString
,除了基于NSRange
的replaceCharactersRange
之外,还可以更好地控制现有属性(从要替换的范围中获取)或者添加其他…您确定错误来自这4行代码吗?调试器在最后一行停止。我在问题中添加了所有行。调试器在第let index=行停止。。。在第一个循环迭代中。到目前为止,代码工作得很好,但由于一些字符串,代码开始崩溃。字符串包含带有一些换行符的普通文本。因此,基本上您要遍历此字符串并删除所有\n
字符,并将其替换为空格
字符?为什么不直接使用replaceOcurrencesOfString
?它是一个属性字符串,我将属性添加到被替换的范围中。但这与问题无关,因为代码从未达到这一点。你确定错误来自这4行代码吗?调试器在最后一行停止。我将所有行添加到问题中。调试器在第let index=行停止。。。在第一个循环迭代中。到目前为止,代码工作得很好,但由于一些字符串,代码开始崩溃。字符串包含带有一些换行符的普通文本。因此,基本上您要遍历此字符串并删除所有\n
字符,并将其替换为空格
字符?为什么不直接使用replaceOcurrencesOfString
?它是一个属性字符串,我将属性添加到被替换的范围中。但这并不重要,因为代码永远不会到达那个点。我的代码实际上是一个循环,所以它有必要的检查,这就是为什么它使用范围。但是它在循环的第一轮中崩溃了。我的代码实际上是一个循环,所以它有必要的检查,这就是为什么它使用范围。但它在第一轮循环中崩溃了,但这并不是导致崩溃的原因,正如你从索引中看到的那样。我的字符串没有任何不在0…255范围内的字符。这不可能是事实,因为您的字符。endIndex
为437个字符,而字符。count
仅为435个字符,所以一定有一两个“流氓”字符潜入了?而且,如何使用Swift字符串的索引替换NSAttribute字符串中的范围或向范围添加属性?我可能会枚举