在开发过程中特别是做通讯录一类功能时经常要用到 中文转换拼音 以及 中文数组排序 ,下面记录一下方法,方便以后查看,有需要的可以收藏一下。


中文转换拼音

只需要为 String 类写一个扩展即可,下面方法全部写在 extension String { } 中。

  • 判断字符串中是否有中文
/// 判断字符串中是否有中文
func isIncludeChinese() -> Bool {
    for ch in self.unicodeScalars {
        if (0x4e00 < ch.value  && ch.value < 0x9fff) { return true } // 中文字符范围:0x4e00 ~ 0x9fff
    }
    return false
}
"张三".isIncludeChinese() // 输出结果 true
"zhangsan".isIncludeChinese() // 输出结果 false
  • 将中文字符串转换为拼音
/// 将中文字符串转换为拼音
///
/// - Parameter hasBlank: 是否带空格(默认不带空格)
func transformToPinyin(hasBlank: Bool = false) -> String {
    let stringRef = NSMutableString(string: self) as CFMutableString
    CFStringTransform(stringRef,nil, kCFStringTransformToLatin, false) // 转换为带音标的拼音
    CFStringTransform(stringRef, nil, kCFStringTransformStripCombiningMarks, false) // 去掉音标
    let pinyin = stringRef as String
    return hasBlank ? pinyin : pinyin.replacingOccurrences(of: " ", with: "")
}
"张三".transformToPinyin() // 输出结果 "zhangsan"
"张三".transformToPinyin(hasBlank: true) // 输出结果 "zhang san"
  • 获取中文首字母
/// 获取中文首字母
///
/// - Parameter lowercased: 是否小写(默认大写)
func transformToPinyinHead(lowercased: Bool = false) -> String {
    let pinyin = self.transformToPinyin(hasBlank: true).capitalized // 字符串转换为首字母大写
    var headPinyinStr = ""
    for ch in pinyin.characters {
        if ch <= "Z" && ch >= "A" {
            headPinyinStr.append(ch) // 获取所有大写字母
        }
    }
    return lowercased ? headPinyinStr.lowercased() : headPinyinStr
}
"张三".transformToPinyinHead() // 输出结果 "ZS"
"张三".transformToPinyinHead(lowercased: true) // 输出结果 "zs"

中文数组排序

只需要为 Array 类写一个扩展即可,必须为 Array<String> 类型才能排序。

extension Array {

    /// 数组内中文按拼音字母排序
    ///
    /// - Parameter ascending: 是否升序(默认升序)
    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
    }
}
["张三", "李四", "王五", "赵六", "钱七"].sortedByPinyin()
// 输出结果
// 0 : "李四"
// 1 : "钱七"
// 2 : "王五"
// 3 : "张三"
// 4 : "赵六"

["张三", "李四", "王五", "赵六", "钱七"].sortedByPinyin(ascending: false)
// 输出结果
// 0 : "赵六"
// 1 : "张三"
// 2 : "王五"
// 3 : "钱七"
// 4 : "李四"

[1, 2, 3, 4, 5, 6, 7].sortedByPinyin() // 输出结果 nil

我的传送门: 博客简书微博GitHub