【iOS 开发】Swift 中文转换拼音以及中文数组排序

Swift

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


中文转换拼音

只需要为 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,696评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,944评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,645评论 18 399
  • Swift学习有问必答群 : 313838956 ( mac版QQ有权限要求, 入群只能通过手机版 QQ申请...
    Guards翻译组阅读 11,769评论 9 13
  • 曾经看过一段数据分析,最后的结论下到我了:相比平淡相处的夫妻,深爱的夫妻离婚的概率更大。 平淡相处,比较接近社会角...
    黄落落的客厅阅读 3,775评论 0 0

友情链接更多精彩内容