使用Swift从NSString中查找出现为NSRange的字符串,结果在NSAttributedString中使用NSRange
问题描述:
我试图在字符串中找到若干个字符串的NSRange
。使用Swift从NSString中查找出现为NSRange的字符串,结果在NSAttributedString中使用NSRange
在我的以下代码中,我使用String.range(of: String, options: , Range)
方法查找Range
,并将其转换为NSRange
。
let findInString = "This #is a #tag #tag inten#sive#search" // MAY CONTAINS EMOJIS
let findStrings = ["#is","#tag","#sive","#search"]
let result = NSMutableAttributedString(string: findInString)
for (index, stringToFind) in findStrings.enumerated() {
var nextStartIndex = findInString.startIndex
while let range = findInString.range(of: stringToFind, options: [.literal, .caseInsensitive], range: nextStartIndex..<findInString.endIndex) {
let start = findInString.distance(from: findInString.startIndex, to: range.lowerBound)
let length = findInString.distance(from: range.lowerBound, to: range.upperBound)
result.addAttribute(NSLinkAttributeName, value: "\(index):", range: NSMakeRange(start, length))
nextStartIndex = range.upperBound
}
}
问:当文本包含多码单元Unicode字符,如表情符这种转换失败,将它的工作如果我使用NSString.range()
找到NSRange
。我正在尝试这个,但我的下面的代码在range:
部分有错误。
let findInNsString = findInString as NSString
while let range = findInNsString.range(of: stringToFind, options: [.literal, .caseInsensitive], range: nextStartIndex..<findInString.endIndex)
我需要帮助理解和纠正上述错误,提前致谢。
答
发现一个Range
到NSRange
,由于转换为MartinR这个answer
我用错了方式Range
转换为NSRange
正确的方法,这里是工作的代码段与从Range
转换有道到NSRange
:
let findStrings = ["#is","#tag","#siØve","#search"]
let findInString = "This #is a #tag #tag inten#siØve#search"
let result = NSMutableAttributedString(string: findInString)
let utf16 = findInString.utf16
for (index, stringToFind) in findStrings.enumerated() {
var nextStartIndex = findInString.startIndex
while let range = findInString.range(of: stringToFind, options: [.literal, .caseInsensitive], range: nextStartIndex..<findInString.endIndex) {
// PROPER WAY TO CONVERT TO NSRange
let from = range.lowerBound.samePosition(in: utf16)
let start = utf16.distance(from: utf16.startIndex, to: from)
let length = utf16.distance(from: from, to: range.upperBound.samePosition(in: utf16))
result.addAttribute(NSLinkAttributeName, value: "\(index):", range: NSMakeRange(start, length))
nextStartIndex = range.upperBound
}
}