与其将字符串拆分为组件,我会使用正则表达式搜索来查找以@开头的字符串的范围,然后应用该颜色。以下是一个工作示例:
extension String {
public func getMatches(regex: String, options: NSStringCompareOptions?) -> [Range<String.Index>] {
var arr = [Range<String.Index>]()
var rang = Range(start: self.startIndex, end: self.endIndex)
var foundRange:Range<String.Index>?
do
{
foundRange = self.rangeOfString(regex, options: options ?? nil, range: rang, locale: nil)
if let a = foundRange {
arr.append(a)
rang.startIndex = foundRange!.endIndex
}
}
while foundRange != nil
return arr
}
}
let message = "hello @you how are @you today?"
let matches = message.getMatches("@[^ ]{1,}", options: NSStringCompareOptions.RegularExpressionSearch)
let messageMutableString = NSMutableAttributedString(string: message, attributes: [NSFontAttributeName:UIFont(name: "Helvetica", size: 13.0)!])
for m in matches {
messageMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSRange(location:distance(message.startIndex,m.startIndex),length:distance(m.startIndex,m.endIndex)))
}
messageMutableString // string with added attributes
范围问题在下面解决:NSRange(location:distance(message.startIndex,m.startIndex),length:distance(m.startIndex,m.endIndex))
。范围和NSRange不可互换,您必须满足其中一个或另一个的要求。使用distance()可以检索所需的Int值以实例化NSRange。
为什么这比我所做的更好:)? –
有几个原因,虽然它们都不可逾越,但首先假定每个单词在字符串中都是唯一的,因为rangeOfString:“查找并返回给定字符串在接收方中第一次出现的范围。”其次,使用正则表达式提供了灵活性,通过简单地改变匹配所基于的字符串来在发现的词语中不包括逗号,全站等。 – sketchyTech