2014-07-29 1 views
1

Как вы добавляете атрибут в строку UNICODE в Swift?Как добавить атрибут в строку Unicode в Swift?

NSMakeRange, кажется, ожидает, что строка в байтах для строки с байтом длины UNICODE.

Любой способ решить эту проблему? Заранее спасибо.

var s:NSMutableAttributedString = NSMutableAttributedString(string: "வாங்க வாங்க வணக்கமுங்க") 
s.string[0...2] 
s.addAttribute(NSForegroundColorAttributeName, value:UIColor(red:0.0, green:1.0, blue:0.0, alpha:1.0), range:NSMakeRange(0,3)) 

ОБНОВЛЕНО Пример:

let text = "வாங்க வாங்க வணக்கமுங்க" 
var startOfWord = advance(text.startIndex, 4) 
var endOfWord = advance(startOfWord, 3) 
var highlightRange = startOfWord..<endOfWord 
text[startOfWord..<endOfWord] 

let attrText = NSMutableAttributedString(string:text) 
attrText.addAttribute(NSForegroundColorAttributeName, value:UIColor(red:0.0, green:1.0, blue:0.0, alpha:1.0), range:highlightRange) 

Как построить NSRange от быстрого диапазона?

ответ

0

Вы можете преобразовать быструю строку в Swift NSString по

var strAsNSString = "வாங்க வாங்க வணக்கமுங்க" as NSString 

И тогда вы можете создать NSMutableAttributedString.

+0

Спасибо. Проблема не в создании NSMutableAttributedString. Его поиск диапазона для добавления атрибутов. s.string [4..6] даст второе слово, например Если мне нужно выделить это второе слово, как указать диапазон, используя NSMakeRange - который ожидает диапазон в байтах. – ZippyMind

0

Нечто подобное может работать:

let text = "வாங்க வாங்க வணக்கமுங்க" 
var startOfWord = advance(text.startIndex, 5) 
var endOfWord = advance(startOfWord, 5) 
var range = startOfWord..<endOfWord 

Даже если еще несколько работ требуется, чтобы выяснить, как далеко продвинуться (если вы ищете только одного известного слова можно непосредственно получить его с NSRangeFromString)

+0

Задача состоит в том, чтобы построить NSRange из Swift Range. Как мы это делаем? 'пусть текст = "வாங்க வாங்க வணக்கமுங்க"' ' вар = startOfWord заранее (text.startIndex, 4)' ' вар = endOfWord заранее (startOfWord, 3)' ' вар highlightRange = startOfWord .. ZippyMind

1

Я надеюсь, что ниже функция может помочь вам

func findAndAddAttributeString(str: String, query : String) { 

    let strASNSString = str as NSString 

    println("employeeIdAsNSString, \(strASNSString)") 

    var attributeDictionary = NSMutableDictionary(objects: [UIColor.grayColor(), UIFont.systemFontOfSize(17)], forKeys: [NSForegroundColorAttributeName, NSFontAttributeName]) 


    println("attributeDictionary, \(attributeDictionary)") 

    var attributedEmployeeId = NSMutableAttributedString(string: strASNSString, attributes: attributeDictionary) 

    println("attributedEmployeeId = \(attributedEmployeeId)") 

    var error:NSError? 

    var regex = NSRegularExpression.regularExpressionWithPattern(query, options: NSRegularExpressionOptions.CaseInsensitive, error: &error) 
    println("regex = \(regex)") 

    var range = NSMakeRange(0, strASNSString.length) 
    println("range = \(range)") 

    regex.enumerateMatchesInString(strASNSString, options: nil, range: range, usingBlock:{ (textCheckingResult, MatchingFlags, unsafePointer) in 
     println("textCheckingResult \(textCheckingResult.rangeAtIndex(0))") 
     var subStringRange = textCheckingResult.rangeAtIndex(0) 
     attributedEmployeeId.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: subStringRange) 
     }) 
} 
+0

Для строк UNICODE .length может не работать. countElements и предварительные методы для определения точных диапазонов. Это может не сработать. – ZippyMind

+0

http://oleb.net/blog/2014/07/swift-strings/ эта ссылка может вам помочь. – Loganathan

2

Я создал небольшое расширение для String, который работает как для Index на основе и Int на основе диапазонов.

extension String { 
    func NSRangeFromRange(swiftRange: Range<Index>) -> NSRange { 
     let start = swiftRange.startIndex.samePositionIn(utf16) 
     let end = swiftRange.endIndex.samePositionIn(utf16) 
     return NSRange(location: utf16.startIndex.distanceTo(start), length: start.distanceTo(end)) 
    } 
    func NSRangeFromRange(swiftRange: Range<Int>) -> NSRange { 
     let indexRange = Range(start: startIndex.advancedBy(swiftRange.startIndex), end: startIndex.advancedBy(swiftRange.endIndex)) 
     return NSRangeFromRange(indexRange) 
    } 
} 

Примечания: Функция находится на String класс, потому что нам нужны струны UTF16View конвертировать между Юникодом Range<Index> и не-Юникодом NSRange.

+0

Существует один случай, когда этот подход не дает правильных результатов, и это Emojis с модификаторами тона кожи. Однако это ошибка в Swift, поскольку они сообщают о длине символов, как неверно, как 2 вместо 1: https://devforums.apple.com/message/1126558#1126558 –

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