【问题标题】:Finding occurrences of String as NSRange from an NSString using Swift, result NSRange to be used in NSAttributedString使用 Swift 从 NSString 中查找字符串作为 NSRange 的出现,结果 NSRange 将在 NSAttributedString 中使用
【发布时间】:2017-06-18 13:00:48
【问题描述】:

我正在尝试在一个字符串中查找多个字符串的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)

我需要帮助来理解和纠正上述错误,在此先感谢。

【问题讨论】:

    标签: ios swift string nsstring nsattributedstring


    【解决方案1】:

    找到将Range 转换为NSRange 的正确方法,感谢MartinR 提供的answer

    我使用错误的方式将Range 转换为NSRange,这里是工作代码sn-p 以及从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
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多