在开发过程中特别是做通讯录一类功能时经常要用到
中文转换拼音
以及中文数组排序
,下面记录一下方法,方便以后查看,有需要的可以收藏一下。
中文转换拼音
只需要为 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
将来的你,一定会感激现在拼命的自己,愿自己与读者的开发之路无限美好。