【问题标题】:Swift substring crash on reversed (Need a Reason)反转时的 Swift 子字符串崩溃(需要一个原因)
【发布时间】:2019-03-07 07:32:43
【问题描述】:

以下代码遇到了一个奇怪的问题:

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" 它不会崩溃。有多种方法可以解决这个问题,但我想知道它为什么会崩溃?

【问题讨论】:

  • 我对此没有确切的答案,但\r\n 是一个段落中断,就像\r\n 分别是段落中断一样。因此,崩溃可能是由 range 函数引起的,它在某一点将 \r\n 视为单个字符,而在另一点将其视为两个单独的字符。
  • @JoakimDanielson:这肯定会导致问题,但我想知道这种行为是“故意的”还是错误。
  • 《Swift 编程语言》一书在列出 escaped special characters 时不包含 \r\n,但较早的文档(参考 NSString)确实包含它。我还发现在 \r\n 上执行 count 会产生 1 的长度,但是当使用 character(at:) 时,我可以为 01 执行此操作,因此看起来它在字符串为作为字符串对象或单个字符访问。也许不相关但有趣:)

标签: swift xcode swift4 swift-subscript


【解决方案1】:

因为Swift\r\n当作一个字符,

let foo = "\r"
foo.count // 1
let fee = "\n"
fee.count // 1
let bee = "\r\n"
bee.count // 1

您的一个解决方案是在它们之间放置一个空格\r \n,这将使它运行,因为现在它们是 2 个不同的字符。

如何?

缓冲区在变量中将它们注册为一个字符,但在 .range 迭代器中被视为两个字符,这会导致崩溃。

【讨论】:

  • 感谢@Mohmmad 提供解释。我喜欢这个解释,可能是崩溃的原因。
猜你喜欢
  • 2013-05-12
  • 2014-11-13
  • 1970-01-01
  • 2014-05-30
  • 2021-03-03
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多