代码之家  ›  专栏  ›  技术社区  ›  Leo

如何在Swift中解析twitch IRC表情?

  •  1
  • Leo  · 技术社区  · 3 年前

    我正在尝试解析TwitchIRC表情并从字符串中提取它。Twitch IRC message提供了一个范围,该范围是字符串中emote的位置。例子:

    表示emote Kappa位于字符串“Kappa abcdef”的索引0到4之间。

    下面是我的函数,它将根据范围返回emote:

    func extractEmoteName(from message: String, rangeStart: Int, rangeEnd: Int) -> String? {
        guard
            let indexStart = message.index(message.startIndex, offsetBy: rangeStart, limitedBy: message.endIndex),
            let limitIndex = message.index(message.endIndex, offsetBy: -1, limitedBy: message.startIndex),
            let indexEnd = message.index(message.startIndex, offsetBy: rangeEnd, limitedBy: limitIndex)
        else {
            print("out of bounds")
            return nil
        }
        
        return String(message[indexStart ... indexEnd])
    }
    

    在示例字符串上使用: extractEmoteName(from: "Kappa abcdef", rangeStart: 0, rangeEnd: 4) Kappa 因此。

    nil :

    extractEmoteName(from: "⚠️ Kappa", rangeStart: 3, rangeEnd: 7) // prints "out of bounds"
    

    同时,由于Twitch提供的范围不同,因此具有单个标量表情的消息可以很好地解析:

    string=“Kappa”;范围开始=2;范围结束=6

    extractEmoteName(from: "🙂 Kappa", rangeStart: 2, rangeEnd: 6) // returns "Kappa"
    

    应该改变什么 extractEmoteName 让它和所有表情符号一起工作?

    1 回复  |  直到 3 年前
        1
  •  1
  •   igorsgm    3 年前

    unicodeScalars ,它将以unicode标量表示字符串:

    func extractEmoteName(from input: String, rangeStart: Int, rangeEnd: Int) -> String? {
        let message = input.unicodeScalars
        
        guard
            let indexStart = message.index(message.startIndex, offsetBy: rangeStart, limitedBy: message.endIndex),
            let limitIndex = message.index(message.endIndex, offsetBy: -1, limitedBy: message.startIndex),
            let indexEnd = message.index(message.startIndex, offsetBy: rangeEnd, limitedBy: limitIndex)
        else {
            print("out of bounds")
            return nil
        }
        
        return String(message[indexStart ... indexEnd])
    
        2
  •  0
  •   wzso    3 年前

    你可以通过计算标量来实现。

    func extractEmoteName(from message: String, rangeStart: Int, rangeEnd: Int) -> String? {
        guard rangeStart >= 0 && rangeStart <= rangeEnd else {
            return nil
        }
        let scalars = message.unicodeScalars
        let start = scalars.index(scalars.startIndex, offsetBy: rangeStart)
        let end = scalars.index(scalars.startIndex, offsetBy: rangeEnd)
        let nameScalars = scalars[start...end]
        return String(nameScalars)
    }