【iOS 開(kāi)發(fā)】Swift 中文轉(zhuǎn)換拼音以及中文數(shù)組排序

Swift

在開(kāi)發(fā)過(guò)程中特別是做通訊錄一類(lèi)功能時(shí)經(jīng)常要用到 中文轉(zhuǎn)換拼音 以及 中文數(shù)組排序 ,下面記錄一下方法,方便以后查看,有需要的可以收藏一下。


中文轉(zhuǎn)換拼音

只需要為 String 類(lèi)寫(xiě)一個(gè)擴(kuò)展即可,下面方法全部寫(xiě)在 extension String { } 中。

  • 判斷字符串中是否有中文
/// 判斷字符串中是否有中文
func isIncludeChinese() -> Bool {
    for ch in self.unicodeScalars {
        if (0x4e00 < ch.value  && ch.value < 0x9fff) { return true } // 中文字符范圍:0x4e00 ~ 0x9fff
    }
    return false
}
"張三".isIncludeChinese() // 輸出結(jié)果 true
"zhangsan".isIncludeChinese() // 輸出結(jié)果 false
  • 將中文字符串轉(zhuǎn)換為拼音
/// 將中文字符串轉(zhuǎn)換為拼音
///
/// - Parameter hasBlank: 是否帶空格(默認(rèn)不帶空格)
func transformToPinyin(hasBlank: Bool = false) -> String {
    
    let stringRef = NSMutableString(string: self) as CFMutableString
    CFStringTransform(stringRef,nil, kCFStringTransformToLatin, false) // 轉(zhuǎn)換為帶音標(biāo)的拼音
    CFStringTransform(stringRef, nil, kCFStringTransformStripCombiningMarks, false) // 去掉音標(biāo)
    let pinyin = stringRef as String
    return hasBlank ? pinyin : pinyin.replacingOccurrences(of: " ", with: "")
}
"張三".transformToPinyin() // 輸出結(jié)果 "zhangsan"
"張三".transformToPinyin(hasBlank: true) // 輸出結(jié)果 "zhang san"
  • 獲取中文首字母
/// 獲取中文首字母
///
/// - Parameter lowercased: 是否小寫(xiě)(默認(rèn)大寫(xiě))
func transformToPinyinHead(lowercased: Bool = false) -> String {
    let pinyin = self.transformToPinyin(hasBlank: true).capitalized // 字符串轉(zhuǎn)換為首字母大寫(xiě)
    var headPinyinStr = ""
    for ch in pinyin.characters {
        if ch <= "Z" && ch >= "A" {
            headPinyinStr.append(ch) // 獲取所有大寫(xiě)字母
        }
    }
    return lowercased ? headPinyinStr.lowercased() : headPinyinStr
}
"張三".transformToPinyinHead() // 輸出結(jié)果 "ZS"
"張三".transformToPinyinHead(lowercased: true) // 輸出結(jié)果 "zs"

中文數(shù)組排序

只需要為 Array 類(lèi)寫(xiě)一個(gè)擴(kuò)展即可,必須為 Array<String> 類(lèi)型才能排序。

extension Array {
    
    /// 數(shù)組內(nèi)中文按拼音字母排序
    ///
    /// - Parameter ascending: 是否升序(默認(rèn)升序)
    func sortedByPinyin(ascending: Bool = true) -> Array<String>? {
        if self is Array<String> {
            return (self as! Array<String>).sorted { (value1, value2) -> Bool in
                let pinyin1 = value1.transformToPinyin()
                let pinyin2 = value2.transformToPinyin()
                return pinyin1.compare(pinyin2) == (ascending ? .orderedAscending : .orderedDescending)
            }
        }
        return nil
    }
}
["張三", "李四", "王五", "趙六", "錢(qián)七"].sortedByPinyin()
// 輸出結(jié)果
// 0 : "李四"
// 1 : "錢(qián)七"
// 2 : "王五"
// 3 : "張三"
// 4 : "趙六"

["張三", "李四", "王五", "趙六", "錢(qián)七"].sortedByPinyin(ascending: false)
// 輸出結(jié)果
// 0 : "趙六"
// 1 : "張三"
// 2 : "王五"
// 3 : "錢(qián)七"
// 4 : "李四"

[1, 2, 3, 4, 5, 6, 7].sortedByPinyin() // 輸出結(jié)果 nil

將來(lái)的你,一定會(huì)感激現(xiàn)在拼命的自己,愿自己與讀者的開(kāi)發(fā)之路無(wú)限美好。

我的傳送門(mén): 博客簡(jiǎn)書(shū) 、微博GitHub 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第5章 引用類(lèi)型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類(lèi)型 使用基本類(lèi)型...
    大學(xué)一百閱讀 3,679評(píng)論 0 4
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,696評(píng)論 18 399
  • Swift學(xué)習(xí)有問(wèn)必答群 : 313838956 ( mac版QQ有權(quán)限要求, 入群只能通過(guò)手機(jī)版 QQ申請(qǐng)...
    Guards翻譯組閱讀 6,940評(píng)論 9 13
  • 曾經(jīng)看過(guò)一段數(shù)據(jù)分析,最后的結(jié)論下到我了:相比平淡相處的夫妻,深?lèi)?ài)的夫妻離婚的概率更大。 平淡相處,比較接近社會(huì)角...
    黃落落的客廳閱讀 682評(píng)論 0 0

友情鏈接更多精彩內(nèi)容