C 是程序世界的寶庫,在我們面向的設(shè)備系統(tǒng)中侨嘀,也內(nèi)置了大量的 C 動(dòng)態(tài)庫幫助我們完成各種任務(wù)简珠。
因?yàn)?Objective-C 是 C 的超集,因此在以前我們可以無縫地訪問 C 的內(nèi)容摘盆,只需要指定依賴并且導(dǎo)入頭文件就可以了。但是驕傲的 Swift 的目的之一就是甩開 C 的歷史包袱饱苟,所以現(xiàn)在在 Swift 中直接使用 C 代碼或者 C 的庫是不可能的孩擂。舉個(gè)例子,計(jì)算某個(gè)字符串的 MD5 這樣簡單地需求箱熬,在以前我們直接使用 CommonCrypto 中的 CC_MD5 就可以了类垦,但是現(xiàn)在因?yàn)槲覀冊?Swift 中無法直接寫 #import <CommonCrypto/CommonCrypto.h> 這樣的代碼狈邑,這些動(dòng)態(tài)庫暫時(shí)也沒有 module 化,因此快捷的方法就只有借助于通過 Objective-C 來進(jìn)行調(diào)用了蚤认。因?yàn)?Swift 是可以通過 {product-module-name}-Bridging-Header.h 來調(diào)用 Objective-C 代碼的米苹,于是 C 作為 Objective-C 的子集,自然也一并被解決了砰琢。比如對于上面提到的 MD5 的例子蘸嘶,我們就可以通過頭文件導(dǎo)入以及添加 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])
}
}