【问题标题】:Swift 3.0 Speech to Text: Changing Color of WordsSwift 3.0 Speech to Text:改变单词的颜色
【发布时间】:2017-03-25 18:57:46
【问题描述】:

我正在尝试更改由口语设置的文本字段中单词的颜色(例如:快乐、悲伤、愤怒等)。 如果这个词被多次说出来,它就不起作用了。例如,如果我说:“我很开心,因为我的猫对我很好。我的兄弟让我伤心。我又开心了。”它只会改变第一个“快乐”的颜色,我不确定为什么。

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

}

谢谢!

【问题讨论】:

    标签: ios swift speech-to-text


    【解决方案1】:

    您的代码有两个问题。

    第一个问题是您示例中的标点符号。当你这样做时:

    text.components(separatedBy:" ")
    

    生成的数组将如下所示:

    ["I'm", "feeling", "happy", ..., "making", "me", "sad."]
    

    sad 中有一个句号,如果键只是“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
    }
    

    【讨论】:

    • 非常感谢您提供这个很棒的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多