Swift & C
2016-03-03 本文已影响138人
liuwin7
当在 Swift 中使用系统中的 C 库时,有些类型是不兼容的,这是因为通常在C中定义的时候,没有严格的格式区分。
但是,在 Swift 中就会有严格的区分,如整型,可以分为Int,Int32,Int64,UInt,UInt32,UInt64
。
这些在 OC 和 C 的编程的时候,传参时,通常是可以隐式转换的,但是在 Swift 中,是不允许的,只能通过每个类型的构造方法解决这个问题。
如,在一个 Swift 项目中,需要使CommonCrypto
(主要是用于加解密算法,是一个典型的 C 库)时,在加解密传参的时候,需要使用各种选项,如加解密的类型kCCEncrypt/kCCDecrypt
,使用的算法kCCAlgorithmAES/kCCAlgorithmDES/...
,等参数,在传这种参数时,不能直接使用这些已经定义好的类型,而是需要进行一次 Wrap,如CCCrypt方法在定义的时候,使用的是UInt32
,而这些常量在 Swift 中当成了 Int,从而导致,无法兼容,所以需要使用UInt32
的构造方法 Wrap 一下,解决这个
let status = CCCrypt(UInt32(kCCDecrypt),
UInt32(kCCAlgorithmAES),
UInt32(kCCOptionPKCS7Padding),
keyPtr,
kCCKeySizeAES256,
nil,
self.bytes,
self.length,
&output,
self.length + kCCKeySizeAES256,
&dataOutMoved)
如需查看完整的项目源码,可移步https://github.com/liuwin7/AES