Swift 判斷字符串的emoji表情

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
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容