2017-06-18 15 views
0

我试图在字符串中找到若干个字符串的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) 

我需要帮助理解和纠正上述错误,提前致谢。

回答

0

发现一个RangeNSRange,由于转换为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 
    } 

}