【问题标题】:Crash when creating NSRange in String在 String 中创建 NSRange 时崩溃
【发布时间】:2020-01-25 16:04:26
【问题描述】:

我在创建NSRange 时遇到随机崩溃。因为之前加了check,不明白怎么会这样:

let textStr = "whatever you want"   
if let end = textStr.unicodeScalars.index(textStr.startIndex, offsetBy: slide.endIndex, limitedBy: textStr.endIndex){
    let realEnd = textStr.unicodeScalars.index(textStr.startIndex, offsetBy: slide.endIndex)
    nsRange = NSRange(start...realEnd, in: textStr)
}
  • slide 是一个由解析器生成的对象,代表textStr 的一部分。
  • 解析器出于性能原因使用textStr.unicodeScalars

【问题讨论】:

  • 什么是slide,什么是start,你得到什么错误信息?
  • 您不能使用来自不同字符串的字符串索引。顺便说一句,你为什么使用 unicodeScalars 索引?相关stackoverflow.com/a/43233619/2303865
  • 很可能只是start..<realEnd
  • 在初始问题中添加了更多上下文
  • 这只是在黑暗中拍摄,您应该添加一个可重现的示例,并为slide 提供具体值。您所说的性能原因是什么? Swift 中的String API 经过高度优化。

标签: swift string nsrange


【解决方案1】:

这适用于游乐场:

import Foundation

let textStr = "whatever you want"
let slide = "you"
let start = slide.startIndex // not sure what this was meant to be in your code
if textStr.index(textStr.unicodeScalars.startIndex, offsetBy: slide.unicodeScalars.distance(from: slide.startIndex, to: slide.endIndex), limitedBy: textStr.unicodeScalars.endIndex) != nil {
    let realEnd = textStr.index(textStr.unicodeScalars.startIndex, offsetBy: slide.unicodeScalars.distance(from: slide.unicodeScalars.startIndex, to: slide.unicodeScalars.endIndex))
    let nsRange = NSRange(start..<realEnd, in: textStr)
}

不过,这似乎是一种奇怪的方式。也许重新考虑你的方法。

【讨论】:

  • 如果 textStr 中出现不止一次“you”怎么办?
  • 顺便试一下let textStr = "Hello USA ?? !!! Hello World !!!"let slide = "!!!",并在 textStr 处使用结果范围start..&lt;realEnd 来获取子字符串。 textStr[start..&lt;realEnd] 将导致 "Hel"
  • 我对这段代码并不感到骄傲。鉴于我在 NSTextView 中有插入符号位置和一组 unicodeScalars,你会怎么做?
猜你喜欢
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多