Swift & C

当在 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

你可能感兴趣的:(Swift & C)