【发布时间】:2017-11-07 09:01:07
【问题描述】:
我试图在 Swift Playground 中实现 Boyer-Moore 算法,我经常使用 Swift String.Index,但开始困扰我的事情是为什么索引要保持比看起来应该大 4 倍的原因。
例如:
let why = "is s on 4th position not 1st".index(of: "s")
Swift Playground 中的这段代码将生成 _compoundOffset 4 而不是 1。我确信这样做是有原因的,但我在任何地方都找不到解释。
这不是解释如何在 Swift 中获取 char 索引的任何问题的重复,我知道,我使用 index(of:) 函数只是为了说明问题。我想知道为什么使用 String.Index 时第二个字符的值是 4 而不是 1。
所以我猜它保存索引的方式是私有的,我不需要知道内部实现,它可能与 UTF16 和 UTF32 编码有关。
【问题讨论】:
-
可能是因为在 Swift 中每个字符都由 UTF-32 字符表示...?
-
String.Index 应被视为不透明类型。因为按照 Unicode 的工作方式,即使是 4 位也不一定会上升。
-
你显示的不是你比较的真实索引。真正的索引是 1 并且是
why的encodedOffset值,这就是您认为应该是的真正索引。
标签: swift string swift-playground