对于特定的代码部分,我有:
if let endIndex = lineEndIndex {
buffer.removeSubrange(buffer.startIndex ..< endIndex)
}
不幸的是,我看到以下错误 - 致命错误:replaceSubrange:子范围扩展到字符串结束
所以,我需要用这样的方法来防范这种情况:
if (buffer.endIndex < lineEndIndex!) {
lineEndIndex = buffer.endIndex
}
if let endIndex = lineEndIndex {
buffer.removeSubrange(buffer.startIndex ..< endIndex)
}
然而,这似乎有点'kludgy'。是否有更优雅的方法来防止尝试使用removeSubrange函数超出字符串的长度?
更新:
基于Leo关于使用min函数的第二个建议,我的代码块看起来像这样:
// unwrap lineEndIndex
if let endIndex = lineEndIndex {
// use the smaller of two values, buffer length or endIndex
let endIndexVal = min(buffer.endIndex, endIndex)
buffer.removeSubrange(buffer.startIndex ..< endIndexVal)
}
用这个:
buffer.removeSubrange(buffer.startIndex ..< min(endIndex, buffer.endIndex))
这将使用lineEndIndex和buffer.endIndex的较低值,因此如果你的endIndex超出了字符串的末尾,则可以防止错误。