簡體   English   中英

使用Swift從NSString查找String作為NSRange的出現,結果NSRange將在NSAttributedString中使用

[英]Finding occurrences of String as NSRange from an NSString using Swift, result NSRange to be used in NSAttributedString

我試圖在一個字符串中找到多個字符串的NSRange

在下面的代碼中,我使用String.range(of: String, options: , Range)方法來查找Range ,並轉換為NSRange 當文本包含多代碼單元unicode字符(例如emoji)時,此轉換將失敗:

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)

我需要幫助來理解和糾正以上錯誤,謝謝。

找到了將Range轉換為NSRange的正確方法,這要感謝MartinR的回答

我使用了錯誤的方式將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
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM