2016-03-28 20 views
0

Swift String'deki bazı aralıklara öznitelikleri eklemeye çalışıyorum. Alt dizede birinci ve son sembol aralıklarını buldum ve aralarındaki metni (dahil) kırmızı olarak renklendiriyorum.Swift'de NSAttributedString'de String'den daha fazla karakter var mı?

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 
} 

Ama String ve NSMutableAttributedString aralıklar eşit değildir bulundu. Dize'deki Aralık daha kısadır (bu metin Unicode kodlamasında değildir). Temel Dize'de olmayan aralıkları bulmanın bir yolu var mı, NSAttributedString'de doğru bulmak için mi?

Örnek:

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

Neden bu fark nedir?

+0

"bu metin Unicode kodlamada değil" _that_ anlamı nedir? – matt

+0

Bu Windows CP1251 kodlaması –

+1

"Bu, Windows CP1251 kodlamasıdır" Eh, hayır öyle değil. Bir String Unicode'dir. Dizeyi oluştururken Windows CP1251'den dönüştürülmüş olmalısınız. Şu an sahip olduğunuz şey bir karmaşa olabilir. – matt

cevap

1

enter image description here birbirlerine köprülü olsa bile, String ve NSString ayırt. String, yerel Swift'dir ve String aralık dizini bakımından bir aralık tanımlarsınız. NSString, Kakao'dur (Foundation) ve NSRange cinsinden bir aralık tanımlarsınız.

+0

Teşekkürler. Benzer bir soruyla http://stackoverflow.com/questions/29832930/swift-string-count-vs-nsstring-length-not-equal –

+1

ve çevrimiçi kitabımı şu bölümde gördüm: http: //www.apeth. com/swiftBook/ch03.html # SBmismatch – matt

+0

Harika bir kitap! Sağol Matt! –

2

Evet, NSMutableAttributedString numaralı aralıkları bulmak mümkün.

Örnek: oyun alanından

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("]") 

Örnek çıktı:

1

Evet, onu buldum. Windows son satırı "\ r \ n", NSAttributedString öğesindeki iki simgedir, ancak Swift String'te yalnızca bir karakterdir. Benim kodunda kontrol kullanın:

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 
    } 

yardım için teşekkür ederiz !!!

İlgili konular