使用Swift从NSString中查找String出现的NSRange,结果NSRange将在NSAttributedString中使用

时间:2017-06-18 13:00:49

标签: ios swift string nsstring nsattributedstring

我正在尝试在字符串中找到几个字符串的NSRange

在我的以下代码中,我使用String.range(of: String, options: , Range)方法查找Range,并转换为NSRange。当文本包含多代码单元unicode字符时,此转换失败,例如表情符号:

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
    }

}

问题:是否可行如果我使用NSString.range()查找NSRange。我正在尝试这个,但我的以下代码在range:部分中有错误。

let findInNsString = findInString as NSString
while let range = findInNsString.range(of: stringToFind, options: [.literal, .caseInsensitive], range: nextStartIndex..<findInString.endIndex)

我需要帮助才能理解并纠正上述错误,提前谢谢。

1 个答案:

答案 0 :(得分:1)

找到将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
    }

}