2016-09-06 4 views
1

У меня есть NSMutatableString:Вычислить диапазон строки из слова до конца строки в быстрых

var string: String = "Due in %@ (%@) $%@.\nOverdue! Please pay now %@" 
attributedText = NSMutableAttributedString(string: string, attributes: attributes) 

Как рассчитать длину и начальный индекс от слова Overdue в стриже?

до сих пор я пытался:

let startIndex = attributedText.string.rangeOfString("Overdue") 
let range = startIndex..<attributedText.string.finishIndex 

// Access the substring. 
let substring = value[range] 
print(substring) 

Но это не работает.

ответ

3

Вы должны генерировать получившуюся строку первой:

let string = String(format: "Due in %@ (%@) $%@.\nOverdue! Please pay now %@", "some date", "something", "15", "some date") 

Затем использовать .disTanceTo, чтобы получить расстояние между индексами;

if let range = string.rangeOfString("Overdue") { 
    let start = string.startIndex.distanceTo(range.startIndex) 
    let length = range.startIndex.distanceTo(string.endIndex) 

    let wordToEndRange = NSRange(location: start, length: length) 
    // This is the range you need 

    attributedText.addAttribute(NSForegroundColorAttributeName, 
    value: UIColor.blueColor(), range: wordToEndRange) 
} 

enter image description here


Пожалуйста, обратите внимание, что NSRange не работает правильно, если строка содержит Emojis или другие символы Unicode, так что вышеупомянутое решение может не работать должным образом для этого случая.

Пожалуйста, посмотрите на следующие SO ответы для лучшего решения, которые охватывают этот случай, а также:

+0

хорошая работа братан :) –

+1

Genius. Решил 2 из моих проблем, добавив цвет. Большое вам спасибо @ozgur! Хотел бы я удвоить голос. – kevinabraham

+0

Это преобразование строковых индексов в NSRange делает * not * корректно работать, если строка содержит Emojis или другие символы Unicode> U + FFFF. Сравните http://stackoverflow.com/questions/27880650/swift-extract-regex-matches и http://stackoverflow.com/questions/27040924/nsrange-from-swift-range для подобных проблем. - Вы можете попробовать его с помощью 'let string = 'Bla bla Overdue! Bla bla" ' –