Добавьте модификатор тона кожи к смайликам программно - PullRequest
1 голос
/ 19 июня 2019

У меня возникли проблемы с добавлением модификатора тона кожи к смайликам в моем приложении. Например, если я использую:

let text = "?" + "?" 

Он печатает ??

Однако для других смайликов это не работает. Например:

let text = "?‍?" + "?"

Отпечатки ?‍??

Как правильно добавить модификатор тона кожи в эмодзи?

1 Ответ

2 голосов
/ 19 июня 2019

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

Обратите внимание, что этот код не проверяет, поддерживает ли исходная строка оттенок кожи.

...