
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 。