2017-06-18 7 views
0

NSRangeの文字列内の複数の文字列を検索しようとしています。Swiftを使用してNSStringからNSRangeとして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 
    } 

} 

が質問:私はNSRangeを見つけるためにNSString.range()を使用する場合、それはに動作しますが、テキストは、絵文字として、マルチコード単位のUnicode文字が含まれている場合、この変換が失敗します。私はこれを試していますが、私の次のコードはrange:部分にエラーがあります。

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

上記のエラーを理解して修正するには、事前に感謝します。 NSRangeRangeを変換するための正しい方法を見つけた

答えて

0

は、私がNSRangeRangeを変換するために間違った方法を使用していたこのanswer

ためMartinRのおかげで、ここ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 
    } 

} 
関連する問題