Добавление модификатора тона кожи работает только в том случае, если предыдущий символ является простым символом эмодзи. Оказывается, ваш "??"
на самом деле состоит из 3 символов. Обычная женщина Emoji 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("?")) // ???
Обратите внимание, что этот код не проверяет, поддерживает ли исходная строка оттенок кожи.