Swift String 是 Characters 的集合,每个 Character
表示“扩展的 Unicode 字素簇”。
NSString 是 UTF-16 代码单元的集合。
例子:
print("का".characters.count) // 1
print(("का" as NSString).length) // 2
Swift String 范围表示为Range<String.Index>,
和NSString 范围表示为NSRange。
您的函数从一开始就计算Characters 的数量
从大海捞针到针头,那是不同的
来自 UTF-16 代码点的数量。
如果您需要“NSRange 兼容”
字符数,那么最简单的方法是使用
NSString的range(of:)方法:
let haystack = "वह बीना की खुली कोयला खदान में काम करता था।"
let needle = "काम"
if let range = haystack.range(of: needle) {
let pos = haystack.distance(from: haystack.startIndex, to: range.lowerBound)
print(pos) // 21
}
let nsRange = (haystack as NSString).range(of: needle)
if nsRange.location != NSNotFound {
print(nsRange.location) // 31
}
或者,使用 Swift 字符串的 utf16 视图
计算 UTF-16 代码单元:
if let range = haystack.range(of: needle) {
let lower16 = range.lowerBound.samePosition(in: haystack.utf16)
let pos = haystack.utf16.distance(from: haystack.utf16.startIndex, to: lower16)
print(pos) // 31
}
(参见示例
NSRange to Range<String.Index> 了解更多在 Range<String.Index> 之间转换的方法
和NSRange)。