Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios String.anotherIndex原因“;致命错误:无法增加endIndex“;_Ios_Swift - Fatal编程技术网

Ios String.anotherIndex原因“;致命错误:无法增加endIndex“;

Ios String.anotherIndex原因“;致命错误:无法增加endIndex“;,ios,swift,Ios,Swift,我试图获得字符串的startIndex和另一个索引之间的距离,但在第一次循环迭代中得到以下错误。该代码实际上适用于大多数字符串,但在某些情况下会崩溃 致命错误:无法增加endIndex 我不明白,当我试图计算与startIndex的距离时,为什么错误消息说要增加endIndex,而另一个索引小于字符串长度。您的代码对我来说运行良好,但您应该检查错误。既然您正在搜索整个content.string,为什么还要增加设置搜索范围的复杂性呢 像这样的事情会更简单: if let anotherIndex

我试图获得字符串的startIndex和另一个索引之间的距离,但在第一次循环迭代中得到以下错误。该代码实际上适用于大多数字符串,但在某些情况下会崩溃

致命错误:无法增加endIndex


我不明白,当我试图计算与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字符串中的范围或向范围添加属性?我可能会枚举