public static func posOf(needle: String,haystack: String) -> Int { return haystack.distance(from: haystack.startIndex,to: (haystack.range(of: needle)?.lowerBound)!)}
但对于外来字符,返回的值总是太小.例如,“का”被认为是一个单位而不是2个单位.
posOf(needle: "काम",haystack: "वह बीना की खुली कोयला खदान में काम करता था।") // 21
我后来在NSRange中使用21(位置:长度:),其中需要28才能使NSRange正常工作.
解决方法 Swift String是Characters和每个Character的集合代表“扩展的Unicode字形集群”.
Nsstring是UTF-16代码单元的集合.
例:
print("का".characters.count) // 1print(("का" as Nsstring).length) // 2
Swift String范围表示为Range< String.Index>,
和Nsstring范围表示为NSRange.
您的函数从头开始计算字符数
干草堆到针的开头,这是不同的
从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).
以上是内存溢出为你收集整理的可靠的函数来获取Swift中字符串中子字符串的位置全部内容,希望文章能够帮你解决可靠的函数来获取Swift中字符串中子字符串的位置所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)