Swift 5 如何在switch的case语句中处理可能带肤色修饰的emoji匹配问题
解决方案
带肤色修饰的emoji比基础emoji多了Unicode范围为U+1F3FB ~ U+1F3FF的肤色修饰字符,不需要枚举全部6种肤色变体,提前过滤输入中的肤色修饰符后再做匹配即可。
核心预处理代码(Swift 单行实现)
// 过滤所有肤色修饰符,输出无修饰的基础emoji let baseEmoji = blah.unicodeScalars.filter { !(0x1F3FB...0x1F3FF ~= $0.value) }.description
如果需要兼容带/不带U+FE0F变体选择符的emoji(比如列表中的☎️、⭕️这类自带隐形变体符的emoji,避免不同输入格式导致匹配失败),可以扩展过滤规则:
let baseEmoji = blah.unicodeScalars.filter { scalar in !(0x1F3FB...0x1F3FF ~= scalar.value) && scalar.value != 0xFE0F }.description
调整后的完整匹配逻辑
// 先处理输入得到基础emoji再匹配 let baseEmoji = blah.unicodeScalars.filter { !(0x1F3FB...0x1F3FF ~= $0.value) && $0.value != 0xFE0F }.description switch baseEmoji { case "✅": daIcon = self.iconComplete! case "👍": daIcon = self.iconConfirmed! case "🤞": daIcon = self.iconMessageLeft! case "👀": daIcon = self.iconLookingForDocs! case "☎️": daIcon = self.iconVoiceMailLeft! case "❌": daIcon = self.iconPostponed! // 剩余用到的emoji直接添加对应case即可,无需加肤色后缀 default: daIcon = self.iconRedQuestion! }
场景适配说明
该方案完全适配当前需求,仅过滤肤色修饰符和变体选择符,不需要处理零宽连接符拼接的复杂组合emoji,无需提前枚举所有肤色变体,性能开销可忽略。
内容的提问来源于stack exchange,提问作者HirsuteJim
相关产品推荐
相关产品推荐

