美文网首页
调用C动态库

调用C动态库

作者: wangwenju | 来源:发表于2017-07-11 17:46 被阅读0次

    C 是程序世界的宝库,在我们面向的设备系统中,也内置了大量的 C 动态库帮助我们完成各种任务。
    因为 Objective-C 是 C 的超集,因此在以前我们可以无缝地访问 C 的内容,只需要指定依赖并且导入头文件就可以了。但是骄傲的 Swift 的目的之一就是甩开 C 的历史包袱,所以现在在 Swift 中直接使用 C 代码或者 C 的库是不可能的。举个例子,计算某个字符串的 MD5 这样简单地需求,在以前我们直接使用 CommonCrypto 中的 CC_MD5 就可以了,但是现在因为我们在 Swift 中无法直接写 #import <CommonCrypto/CommonCrypto.h> 这样的代码,这些动态库暂时也没有 module 化,因此快捷的方法就只有借助于通过 Objective-C 来进行调用了。因为 Swift 是可以通过 {product-module-name}-Bridging-Header.h 来调用 Objective-C 代码的,于是 C 作为 Objective-C 的子集,自然也一并被解决了。比如对于上面提到的 MD5 的例子,我们就可以通过头文件导入以及添加 extension 来解决:

    // TargetName-Bridging-Header.h
    #import <CommonCrypto/CommonCrypto.h>
    
    // StringMD5.swift
    extension String {
        var MD5: String {
            let cString = self.cString(using: .utf8)
            let length = CUnsignedInt(
                self.lengthOfBytes(using: .utf8)
            )
            let result = UnsafeMutablePointer<CUnsignedChar>.allocate(
                capacity: Int(CC_MD5_DIGEST_LENGTH)
            )
            
            CC_MD5(cString!, length, result)
            
            return String(format:
                "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                          result[0], result[1], result[2], result[3],
                          result[4], result[5], result[6], result[7],
                          result[8], result[9], result[10], result[11],
                          result[12], result[13], result[14], result[15])
        }
    }
    

    相关文章

      网友评论

          本文标题:调用C动态库

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