首页 > 解决方案 > 将 UnicodeScalar 索引转换为 String.Index

问题描述

我正在使用一个将位置作为 UnicodeScalar 索引返回的解析器。在我这边,我使用的是常规的 Swift String 和String.Index.

考虑到字素簇,如何将 UnicodeScalar 索引转换为常规 String.Index?

let flags = ""

例如,将开始创建问题,因为它具有来自单个字符的 2 个 unicode 标量。

注意:我使用的是 Swift 4.2

标签: swiftstringunicode

解决方案


各种 String 视图共享一个公共索引。如果您有一个位置作为 UnicodeScalar 视图的偏移量,则使用String.unicodeScalars.index()将其转换为String.Index. 例子:

let s = ""
print(Array(s.unicodeScalars))
// ["\u{0001F1E6}", "\u{0001F1F9}", "\u{0001F1E7}", "\u{0001F1EA}"]

let ucOffset = 2
let sIndex = s.unicodeScalars.index(s.startIndex, offsetBy: ucOffset)
print(s[sIndex...]) // 

反向计算是用 完成的distance(from:to:)。例子:

let s = ""

if let sIndex = s.index(of:"") {
    let ucOffset = s.unicodeScalars.distance(from: s.startIndex, to: sIndex)
    print(ucOffset) // 2
}

推荐阅读