我在向我的应用程序中的表情符号添加肤色修饰符时遇到一些问题。例如,如果我使用:
let text = "?" + "?"
它打印??
但是,对于其他表情符号,它不起作用。例如:
let text = "??" + "?"
打印???
向表情符号添加肤色修饰符的正确方法是什么?
答案 0 :(得分:2)
仅当前一个字符是纯表情符号字符时,才添加肤色修饰符。事实证明,您的"??"
实际上由3个字符组成。普通女人的表情符号U + 1F469(?
),然后是U + 200D,最后是头发修饰符U + 1F9B0(?
)。
您可以通过以下方式看到此信息:
print(Array("??".unicodeScalars)) // ["\u{0001F469}", "\u{200D}", "\u{0001F9B0}"]
因此,尝试在头发修改器后添加肤色修改器不起作用。肤色修改器必须紧接在基本表情符号之后。
这是一个String扩展名,即使字符已经具有肤色或其他修饰符,该扩展名也将对字符应用肤色。
extension String {
func applySkinTone(_ tone: String) -> String {
guard tone.count == 1 && self.count > 0 else { return self }
let minTone = Unicode.Scalar(0x1F3FB)!
let maxTone = Unicode.Scalar(0x1F3FF)!
guard let toneChar = tone.unicodeScalars.first, minTone...maxTone ~= toneChar else { return self }
var scalars = Array(self.unicodeScalars)
// Remove any existing tone
if scalars.count >= 2 && minTone...maxTone ~= scalars[1] {
scalars.remove(at: 1)
}
// Now add the new tone
scalars.insert(toneChar, at: 1)
return String(String.UnicodeScalarView(scalars))
}
}
print("?".applySkinTone("?")) // ??
print("??".applySkinTone("?")) // ???
请注意,此代码不会验证原始字符串是否支持肤色。