[转载]Swift5中CFStringTransform的使用

参考自原文 https://www.dazhuanlan.com/2020/03/11/5e6825c7056da/
原文参考自 https://nshipster.com/cfstringtransform/

名称按照字母排序,名称可能为数字、纯中文、纯英文、纯日文、或者各种语言的混合。
在Swift中可以使用Core Foundation下的CFStringTransform方法转换。

    /// 转换字符串
    /// - Parameter string: 要转的字符串,需是CFMutableString类型
    /// - Parameter range: 要转换的区间。全部转换可传入 nil
    /// - Parameter transform: 要应用的变换
    /// - Parameter reverse: 是否要反转
    public func (_ string: CFMutableString!, _ range: UnsafeMutablePointer!, _ transform: CFString!, _ reverse: Bool) -> Bool
extension String {
    /// 将任一字符串转换为英文字母字符串
    var pinyin: String {
        let mutableString = NSMutableString(string: self)
        
        // 应用 kCFStringTransformToLatin 变换将所有非英文文本转换为拉丁字母表示, 小写不带音标。
        CFStringTransform(mutableString, nil, "Any-Latin; Latin-ASCII; Any-Lower" as CFString, false)
                
        // 分词去掉空格
        let tokenizer = CFStringTokenizerCreate(nil, mutableString, CFRangeMake(0, CFStringGetLength(mutableString)), 0, CFLocaleCopyCurrent())
        var mutableTokens: [String] = []
        var type: CFStringTokenizerTokenType
        repeat {
            type = CFStringTokenizerAdvanceToNextToken(tokenizer)
            let range = CFStringTokenizerGetCurrentTokenRange(tokenizer)
            let token = CFStringCreateWithSubstring(nil, mutableString, range) as NSString
            mutableTokens.append(token as String)
        } while type != []
        //生成最终字符串
        let joined = mutableTokens.joined()
        return joined.replacingOccurrences(of: "'", with: "")
    }
}

你可能感兴趣的:([转载]Swift5中CFStringTransform的使用)