3

刚刚更新到最新的 Xcode 6.3 Beta 4,我遇到了一个我似乎无法弄清楚的错误。

有错误是:

无法使用类型为“(CCOperation,CCAlgorithm,CCOptions,UnsafePointer,(Int),nil,UnsafePointer,UInt,UnsafeMutablePointer,(Int),inout UInt)”的参数列表调用“CCCrypt”

使用以下代码:

let keyBytes         = UnsafePointer<UInt8>(keyData.bytes)
let keyLength        = size_t(kCCKeySizeAES128)

let dataLength    = UInt(self.length)
let dataBytes     = UnsafePointer<UInt8>(self.bytes)

let bufferData:NSMutableData! = NSMutableData(length:Int(dataLength) + kCCBlockSizeAES128)
var bufferPointer = UnsafeMutablePointer<UInt8>(bufferData.mutableBytes)
let bufferLength  = size_t(bufferData.length)

let operation: CCOperation = UInt32(kCCEncrypt)
let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options:   CCOptions   = UInt32(kCCOptionECBMode)
var numBytesEncrypted: UInt = 0

var cryptStatus = CCCrypt(operation,
            algoritm,
            options,
            keyBytes,
            keyLength,
            nil,
            dataBytes,
            dataLength,
            bufferPointer,
            bufferLength,
            &numBytesEncrypted)

这在 Beta 3 下工作得很好,并且不确定发生了什么变化,即使在阅读了 Beta 4 更改日志之后也是如此。

不知道问题是什么,我应该向 Apple 打开一个错误吗?

4

1 回答 1

9

来自 Xcode 6.3 beta 4 发行说明:

C size_t 系列类型现在作为 Int 导入 Swift,因为 Swift 更喜欢将大小和计数表示为有符号数字,即使它们是非负数。这减少了 Int 和 UInt 之间的显式类型转换量,更好地与返回 Int 的 sizeof 对齐,并提供更安全的算术属性。(18949559)

因此你必须更换

let dataLength    = UInt(self.length)
// ...
var numBytesEncrypted: UInt = 0

经过

let dataLength    = self.length // no conversion needed anymore
// ...
var numBytesEncrypted: Int = 0 // or size_t
于 2015-03-26T22:30:07.113 回答