将UnicodeScalar索引转换为String.Index

时间:2019-11-27 09:37:12

标签: swift string unicode

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

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

let flags = "??"

例如,将开始产生问题,因为它从单个字符中有2个unicode标量。

注意:我正在使用Swift 4.2

1 个答案:

答案 0 :(得分:1)

各种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
}