美文网首页iOS-swiftiOS 开发iOS Developer
【iOS 开发】Swift 中文转换拼音以及中文数组排序

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

作者: 爱吃鸭梨的猫 | 来源:发表于2017-09-15 12:13 被阅读285次
    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

    相关文章

      网友评论

      • Finy:必须果断收藏!多谢
      • 东东隆东抢:Swift 里sort 直接可以排序吧,另外苹果提供得本地化也可以用于排序
        东东隆东抢:@Jonzzs 使用sort,需要“将中文字符串转换为拼音”?这个目的是什么。
        爱吃鸭梨的猫:我这里用的就是 sort 方法啊

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

      本文链接:https://www.haomeiwen.com/subject/jrrssxtx.html