與其將字符串拆分爲組件,我會使用正則表達式搜索來查找以@開頭的字符串的範圍,然後應用該顏色。以下是一個工作示例:
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