反转时Swift子字符串崩溃(需要原因)

反转时Swift子字符串崩溃(需要原因),swift,xcode,swift4,swift-subscript,Swift,Xcode,Swift4,Swift Subscript,我遇到了一个奇怪的问题,代码如下: var testString = """ This is test \r\n Pass Fail """ if let charIndex = testString.range(of: "\n")?.lowerBound { let substring = testString[charIndex...] print(substring.reversed()) var revereseString = String(su

我遇到了一个奇怪的问题,代码如下:

var testString = """
This is test \r\n Pass        Fail
"""

if let charIndex = testString.range(of: "\n")?.lowerBound {
    let substring = testString[charIndex...]
    print(substring.reversed())
    var revereseString = String(substring.reversed())
}
我的应用程序因以下错误而崩溃:致命错误:超出范围:索引


有人能解释为什么在特定情况下它会崩溃吗。如果我从字符串中删除“\r”,它将不会崩溃。有多种方法可以解决此问题,但我想知道它为何崩溃?

其原因是
Swift
\r\n
视为一个字符

let foo = "\r"
foo.count // 1
let fee = "\n"
fee.count // 1
let bee = "\r\n"
bee.count // 1
您的解决方案之一是在它们之间放置一个空格
\r\n
,这样可以使它运行,因为现在它们是两个不同的字符

怎么做?


缓冲区将它们作为一个字符注册到变量中,但在
.range
迭代器中作为两个字符处理,从而导致崩溃

我没有确切的答案,但是
\r\n
是一个段落分隔符,同样
\r
\n
分别是段落分隔符。因此,崩溃可能是由于
范围
函数在某一点上将
\r\n
视为单个字符,在另一点上将其视为两个单独的字符造成的。@JoakimDanielson:这肯定会导致问题,但我想知道这种行为是否是“故意的”或错误。Swift编程语言手册在列出时不包括\r\n,但引用NSString的较旧文档确实包括它。我还发现有趣的是,在上执行
count
会得到长度为1的\r\n,但当使用
字符(at:)
时,我可以对
0
1
执行此操作,因此,当字符串作为字符串对象或单个字符访问时,它看起来有所不同。也许不相关,但很有趣:)谢谢@Mohmmad提供的解释。我喜欢这样的解释,这可能是坠机的原因。