Mam następującą funkcję, aby znaleźć i podświetlić hashtags lub wymienia (@ lub #), w UILabel
:Jak wyróżnić tekst w ciągu zawierającym emotikony w Swift?
class func addLinkAttribute(pattern: String,
toText text: String,
withAttributeName attributeName : String,
toAttributedString attributedString :NSMutableAttributedString,
withLinkAttributes linkAttributes: [NSObject : AnyObject]) {
var error: NSError?
if let regex = NSRegularExpression(pattern: pattern, options:.CaseInsensitive, error: &error) {
regex.enumerateMatchesInString(text, options: .allZeros, range: NSMakeRange(0, count(text))) { result, flags, stop in
let range = result.range
let start = advance(text.startIndex, range.location)
let end = advance(start, range.length)
let foundText = text.substringWithRange(Range<String.Index>(start: start,end: end))
var linkAttributesWithName = linkAttributes
linkAttributesWithName[attributeName] = foundText
attributedString.addAttributes(linkAttributesWithName, range: range)
}
}
}
Jeśli mijam hashtag (#)(\\w+)
lub wymienić (@)(\\w+)
wzór kod działa doskonale, ale jeśli tekst zawiera Emotikon zakres jest równoważone przez liczbę emotikony poprzedzający go:
wiem Swift leczy ciągi inaczej Objective-C, ponieważ count(string)
i count(string.utf16)
daje mi inne wyniki, ale nie jestem pewien, jak to wyjaśnić, używając wyrażenia regularnego.
Mogę po prostu sprawdzić różnicę między 2 liczbami i zrównoważyć zakres, ale wydaje mi się to nieprzyzwoite i hackowate. Musi być inny sposób.
Działa idealnie! Dziękuję Ci. Jestem pewien, że jest sposób na zrobienie tego bez polegania na 'NSString' ale to działa i nie sądzę, że' NSString' wkrótce się pojawi. –
@MichaelGaylord: Pobudziłeś moją ambicję, zobacz zaktualizowaną odpowiedź :) –
@MartinR awesome! Dzięki za udostępnienie! działa jak urok! – Andres