【发布时间】:2019-12-26 18:38:40
【问题描述】:
在post 之后,我尝试将代码从 Swift 2.0 更新到 Swift 5.0,以检查哪些表情符号有可用的肤色以及其他已经存在的变体。 我的更新代码详细:
extension String {
var emojiSkinToneModifiers: [String] {
return [ "????", "????", "????", "????", "????" ]
}
var emojiVisibleLength: Int {
var count = 0
enumerateSubstrings(in: startIndex..<endIndex, options: .byComposedCharacterSequences) { (_, _, _, _) in
count = count + 1
}
return count
}
var emojiUnmodified: String {
if self.count == 0 {
return ""
}
let range = String(self[..<self.index(self.startIndex, offsetBy: 1)])
return range
}
var canHaveSkinToneModifier: Bool {
if self.count == 0 {
return false
}
let modified = self.emojiUnmodified + self.emojiSkinToneModifiers[0]
return modified.emojiVisibleLength == 1
}
}
并将其与数组一起使用:
let emojis = [ "????", "????????", "????" ]
for emoji in emojis {
if emoji.canHaveSkinToneModifier {
let unmodified = emoji.emojiUnmodified
print(emoji)
for modifier in emoji.emojiSkinToneModifiers {
print(unmodified + modifier)
}
} else {
print(emoji)
}
}
输出: ????????????????????????????????????????????? ??????????????????????????????????????????????????? ?????????????????? ????????????????????????????????????????????? 将变体分配给没有它们或已经存在的表情符号,而不是:?????????????????????????????????? ?????? ?????? ????
我想enumerateSubstringsInRange 是不正确的,self.characters.count 现在变成了self.count,与before Swift 4 相比,计数一个表情符号(合成)很容易且正确,但在这种情况下可能没有用。我没看错什么?
谢谢
【问题讨论】:
-
我目前没有答案,但请注意,从 Swift 4 开始,扩展字形簇算作单个字符,因此
s.emojiVisibleLength的结果与s.count相同(比较stackoverflow.com/q/39104152/1187415)。 -
糟糕,我的意思是 Emoji 序列 在 Swift 4(及更高版本)中被视为单个字符。
-
@MartinR 我也曾假设...欢迎提供解决方案????