Swift 5 isEmoji метод возвращает true для числа? - PullRequest
1 голос
/ 04 августа 2020

Как в примере ниже isEmoji метод возвращает true для числа :

let scalars: [Unicode.Scalar] = ["?", "+", "1"]
for s in scalars {
    print(s, "-->", s.properties.isEmoji)
}
// ? --> true
// + --> false
// 1 --> true... wait what? ?

Но почему и как определить для последнего случая в моем примере.

1 Ответ

1 голос
/ 04 августа 2020

Я немного поискал после того, как столкнулся с этой проблемой, и нашел ответ в документации Apple . Я делюсь с вами, чтобы вы не тратили свое драгоценное время в будущем:

Окончательный результат верен, потому что цифры ASCII имеют нестандартные представления эмодзи; некоторые платформы отображают их с другим внешним видом.

Из-за такого поведения тестирования isEmoji только на одном скаляре недостаточно, чтобы определить, отображается ли единица текста как смайлик; правильный тест требует проверки нескольких скаляров в символе. Помимо проверки того, имеет ли базовый скаляр isEmoji == true, вы также должны проверить его представление по умолчанию (см. IsEmojiPresentation) и определить, следует ли за ним селектор вариантов, который изменит представление. Это свойство соответствует свойству «Emoji» в стандарте Unicode .

РЕШЕНИЕ

Таким образом, вы можете проверить, как показано в строке ниже:

let scalars: [Unicode.Scalar] = ["?", "+", "1"]
for s in scalars {
    print(s, "-->", (s.properties.isEmoji && s.properties.isEmojiPresentation))
}
// ? --> true
// + --> false
// 1 --> false
...