2016-03-28 12 views
0

Ich versuche, einigen Bereichen in Swift String Attribute hinzuzufügen. Ich habe Bereiche des ersten und letzten Symbols in Teilstrings gefunden und färbe den Text zwischen ihnen (einschließlich) in rot.In Swift hat NSAttributedString mehr Zeichen als String?

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 
} 

Aber ich fand, dass Bereiche in String und in NSMutableAttributedString nicht gleich sind. Range in String ist kürzer (dieser Text ist nicht in Unicode-Codierung). Gibt es eine Möglichkeit, Bereiche nicht im zugrunde liegenden String zu finden, sondern in NSAttributedString, um sie korrekt zu finden?

Beispiel:

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

Warum ist dieser Unterschied?

+0

"Dieser Text ist nicht in Unicode-Codierung" Was bedeutet _that_? – matt

+0

Es ist Windows CP1251 Codierung –

+1

"Es ist Windows CP1251 Codierung" Nun, nein ist es nicht. Eine Zeichenfolge ist Unicode. Sie sollten beim Erstellen der Zeichenfolge von Windows CP1251 konvertiert haben. Was Sie jetzt haben, könnte etwas Unordnung sein. – matt

Antwort

1

Unterscheiden zwischen Streich- und NSString, obwohl sie miteinander überbrückt sind. String ist nativ Swift, und Sie definieren einen Bereich in Form eines String-Zeichenindex. NSString ist Cocoa (Foundation) und Sie definieren einen Bereich in Bezug auf NSRange.

+0

Danke. Ich fand ähnliche Frage http://stackoverflow.com/questions/29832930/swift-string-count-vs-nsstring-length-not-equal –

+1

Und siehe mein Online-Buch, in diesem Abschnitt: http: //www.apeth. com/swiftBook/ch03.html # SBmismatch – matt

+0

Ein tolles Buch! Danke, Matt! –

2

Ja, es ist möglich, Bereiche in NSMutableAttributedString zu finden.

Beispiel:

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

Beispiel Ausgabe von Spielplatz: enter image description here

1

Ja, ich habe es gefunden. Windows-End-of-Line "\ r \ n" ist zwei Symbole in NSAttributedString, aber nur ein Zeichen in Swift String. Ich benutze Überprüfung in meinem Code:

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 
    } 

Vielen Dank für die Hilfe !!!

Verwandte Themen