2016-03-28 2 views
0

Я пытаюсь добавить атрибуты в некоторые диапазоны в Swift String. Я нашел диапазоны первого и последнего символа в подстроке и покрасил текст между ними (в том числе) в красный цвет.В Swift NSAttributedString больше символов, чем 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 
} 

Но я обнаружил, что диапазоны в String и NSMutableAttributedString не равны. Диапазон в String короче (этот текст отсутствует в кодировке Unicode). Есть ли способ найти диапазоны не в базовой строке, а в NSAttributedString, чтобы найти ее правильно?

Пример:

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

Почему эта разница?

+0

«этот текст не в кодировке Юникод» Что означает _that_? – matt

+0

Это кодировка Windows CP1251 –

+1

«Это кодировка Windows CP1251« Ну, нет, это не так. Строка - это Юникод. Вы должны были преобразовать из Windows CP1251 при создании строки. Теперь у вас может быть что-то вроде беспорядка. – matt

ответ

1

Различать струнных и NSString, несмотря на то, что они соединяются друг с другом. Строка является родной Swift, и вы определяете диапазон в терминах индекса строки String. NSString - это Cocoa (Foundation), и вы определяете диапазон в терминах NSRange.

+0

Спасибо. Я нашел аналогичный вопрос http://stackoverflow.com/questions/29832930/swift-string-count-vs-nsstring-length-not-equal –

+1

И посмотрите мою онлайн-книгу в этом разделе: http: //www.apeth. com/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 end-of-line «\ r \ n» - это два символа в NSAttributedString, но только один символ в строке Swift. Я использую проверки в моем коде:

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 
    } 

Спасибо всем за помощь !!!

Смежные вопросы