根据这篇文章,我尝试将代码从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
。相比于Swift 4之前,这种方法易于计算一个组合的表情符号,但在这种情况下可能不太有用。我错过了什么吗?
谢谢
s.emojiVisibleLength
的结果与s.count
相同(请参见https://dev59.com/ilkT5IYBdhLWcg3wFrkT)。 - Martin R