extension Character
extension Character {
//簡單的emoji是一個標量 以emoji的形式呈現給用戶
var isSimpleEmoji: Bool {
guard let firstProperties = unicodeScalars.first.properties else {
return false
}
return unicodeScalars.count == 1 && (firstProperties.isEmojiPresentation || firstProperties.generalCategory ==.otherSymbol)
}
//檢測標量是否將合并到emoji中
var isCombineIntoEmoji: Bool{
return unicodeScalars.count > 1 && unicodeScalars.contains{$0.properties.isJoinControl || $0.properties.isVariationSelector}
}
//屬否為emoji表情
var isEmoji: Bool {
return isSimpleEmoji || isCombineIntoEmoji
}
}
extension String
extension String {
//是否為單個emoji表情
var isSingleEmoji: Bool {
return count == 1 && containsEmoj
}
//是否包含emoji表情
var containsEmoji: Bool {
return contains{$0.isEmoji}
}
//只包含emoji表情
var containsOnlyEmoji: Bool {
return !isEmpty && !contains{!$0.isEmoji}
}
//提取emoji表情字符串
var emojiString: String {
return emojis.map{ String($0) }.reduce("",+)
}
//獲取emoji表情數組
var emojis: [Character] {
return filter{$0.isEmoji}
}
//提取單元編碼標量
var emojiScallars: [UnicodeScalar] {
return filter{$0.isEmoji}.flatMap{ $0.unicodeScalars}
}
}
使用舉例
"A???".containsEmoji // false
"3".containsEmoji // false
"A?????".unicodeScalars // [65, 795, 858, 790, 9654, 65039]
"A?????".emojiScalars // [9654, 65039]
"3??".isSingleEmoji // true
"3??".emojiScalars // [51, 65039, 8419]
"????".isSingleEmoji // true
"?????♂?".isSingleEmoji // true
"???????????".isSingleEmoji // true
"???????????".containsOnlyEmoji // true
"Hello ???????????".containsOnlyEmoji // false
"Hello ???????????".containsEmoji // true
"?? Héllo ???????????".emojiString // "?????????????"
"???????????".count // 1
"?? Héll? ???????????".emojiScalars // [128107, 128104, 8205, 128105, 8205, 128103, 8205, 128103]
"?? Héll? ???????????".emojis // ["??", "???????????"]
"?? Héll? ???????????".emojis.count // 2
"?????????????????????".isSingleEmoji // false
"?????????????????????".containsOnlyEmoji // true