[英]Swift 3.0 Speech to Text: Changing Color of Words
我试图通过口头语言改变文本字段中的单词颜色(例如:快乐,悲伤,愤怒等)。 如果不止一次说出这个词,它就不起作用。 例如,如果我说,“我感到高兴,因为我的猫对我很好。我哥哥让我伤心。我再次开心。” 它只会改变第一个'快乐'的颜色,我不确定为什么。
func setTextColor(text: String) -> NSMutableAttributedString {
let string:NSMutableAttributedString = NSMutableAttributedString(string: text)
let words:[String] = text.components(separatedBy:" ")
for word in words {
if emotionDictionary.keys.contains(word) {
let range:NSRange = (string.string as NSString).range(of: word)
string.addAttribute(NSForegroundColorAttributeName, value: emotionDictionary[word], range: range)
}
}
return string
}
谢谢!
您的代码有两个问题。
第一个问题是你的例子中的标点符号。 当你这样做时:
text.components(separatedBy:" ")
结果数组将如下所示:
["I'm", "feeling", "happy", ..., "making", "me", "sad."]
如果关键只是“悲伤”,那么悲伤就会有一段时间与你的情感词典中的内容不相符。
第二个问题是:
let range:NSRange = (string.string as NSString).range(of: word)
由于你在你的例子中有两次“快乐”,这只会返回第一次出现快乐的范围,因此只会突出显示第一次快乐。
最好的方法是为情绪词典中的每个键使用正则表达式。 然后你可以调用regex.matches来获取所有出现的快乐或悲伤的范围。 然后,您可以循环并适当地设置颜色。
这将执行以下操作并应与您的示例一起使用:
func setTextColor(text: String) -> NSMutableAttributedString {
let string:NSMutableAttributedString = NSMutableAttributedString(string: text)
for key in emotionDictionary.keys {
do {
let regex = try NSRegularExpression(pattern: key)
let allMatches = regex.matches(in: text, options: [], range: NSMakeRange(0, string.length))
.map { $0.range }
for range in allMatches {
string.addAttribute(NSForegroundColorAttributeName, value: emotionDictionary[key], range: range)
}
}
catch { }
}
return string
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.