繁体   English   中英

Swift 3.0语音到文本:改变单词的颜色

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM