我正在使用一个解析器,该解析器将位置作为UnicodeScalar索引返回。就我而言,我正在使用常规的Swift String和String.Index
。
考虑字素簇,如何将UnicodeScalar索引转换为常规String.Index?
let flags = "??"
例如,将开始产生问题,因为它从单个字符中有2个unicode标量。
注意:我正在使用Swift 4.2
答案 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
}