背景
我正在swift中编写一种语法标记工具。我解析文本,然后保存标记信息,我称之为Mark
(名称为String
,范围为Range<String.Index>
)。我选择Range<String.Index>
超过NSRange
以便将来证明界面。
问题
为了支持即时解析,我需要能够操作范围。例如。文本已在文本视图中编辑,而不是重新解析整个文本,我只想解析编辑的块以获得性能增益。问题是如何在编辑范围之后移动Marks
?由于它们永远不会改变,唯一改变的是范围。
我已尝试the index function这样:
let newStartIndex = string.index(oldStartIndex, offsetBy: changeInLength)
但问题是oldStartIndex
很可能超出新string
的范围。然后它会抛出一个致命的错误。即使我保留了旧文本的副本并使用它来执行索引偏移,我认为修改后的字符串中的旧索引可能不一定保持其完整性。
使用NSRange
,事情要简单得多,只需移动location
属性即可。但关键是通过使用Range<String.Index>
来验证界面。