2016-03-28 6 views
0

Swift Stringの一部の範囲に属性を追加しようとしています。 部分文字列に最初と最後の記号の範囲を見つけ、それらの間のテキストに赤を含めて色付けしました。Swift NSAttributedStringに文字列より多くの文字がありますか?

let mutableString = NSMutableAttributedString(string: text) 
let str = mutableString.string 
//Red symbols 
var t = 0 
let symbols = mutableString.string.characters.count 
while t < symbols { 
    if str[t] == "[" { 
    let startIndex = t 
    while str[t] != "]" { 
     t += 1 
    } 
    t += 1 
    let endIndex = t 

    mutableString.addAttribute(
     NSForegroundColorAttributeName,      
     value: UIColor.redColor(), 
     range: NSMakeRange(startIndex, endIndex - startIndex)) 
    } 
    t += 1 
} 

しかし、文字列とNSMutableAttributedStringの範囲が等しくないことがわかりました。文字列の範囲はより短いです(このテキストはUnicodeエンコーディングではありません)。 NSAttributedStringには、基になるStringではなく範囲を見つける方法がありますか?

例:

print(mutableString.length) //550 
print(mutableString.string.characters.count) //548 

なぜこの違いは何ですか?

+0

"このテキストはUnicodeエンコーディングではありません" _that_は何を意味していますか? – matt

+0

Windows CP1251をエンコードしています –

+1

「Windows CP1251をエンコードしています」まあ、そうではありません。文字列はUnicodeです。文字列を作成したときにWindows CP1251から変換したはずです。あなたが今持っているものは混乱の何かかもしれません。 – matt

答えて

1

は、それらが互いに架橋されていても、文字列とNSStringの間で区別する。文字列はネイティブのSwiftで、文字列の文字インデックスの範囲を定義します。 NSStringはCocoa(Foundation)で、NSRangeの範囲で範囲を定義します。

+0

ありがとうございます。私は同様の質問を見つけましたhttp://stackoverflow.com/questions/29832930/swift-string-count-vs-nsstring-length-not-equal –

+1

そして、このセクションの私のオンラインブック、http://www.apethを見てください。 co.jp/swiftBook/ch03.html#SBmismatch – matt

+0

すばらしい本です!ありがとう、マット! –

2

はい、範囲はNSMutableAttributedStringにあります。

例:遊び場から

let text = "[I love Ukraine!]" 

var start = text.rangeOfString("[") 
var finish = text.rangeOfString("]") 

let mutableString = NSMutableAttributedString(string: text) 

let startIndex = mutableString.string.rangeOfString("[") 
let finishIndex = mutableString.string.rangeOfString("]") 

出力例:enter image description here

1

はい、見つかりました。 Windowsエンドオブライン"\ r \ n"は、NSAttributedStringの2つのシンボルですが、Swift Stringの1文字のみです。私は自分のコードをチェックインする使用 :

let symbols = mutableString.string.characters.count 
var extendedSymbols = 0 
    while t < symbols { 
     if str[t] == "\r\n" { extendedSymbols += 1 } 
     else if str[t] == "[" { 
      let startIndex = t + extendedSymbols 
      while str[t] != "]" { 
       t += 1 
      } 
      t += 1 
      let endIndex = t + extendedSymbols 

      mutableString.addAttribute(
       NSForegroundColorAttributeName, 
       value: UIColor.redColor(), 
       range: NSMakeRange(startIndex, endIndex - startIndex)) 
     } 
     t += 1 
    } 

は助けありがとうございました!!!

関連する問題