在Swift 1.2中,我正在尝试编译我在rosettacode上找到的md5实现 一行给了我一个错误,我无法弄清楚原因。
这是一行:
chunk.getBytes(M[x], range:range)
这是我得到的错误:
无法使用类型为'(UInt32,范围:_NSRange)'的参数调用'getBytes'
这就是背景:
// break chunk into sixteen 32-bit words M[j], 0 ≤ j ≤ 15
let wordSize = sizeof(UInt32)
var M:[UInt32] = [UInt32](count: 16, repeatedValue: 0)
for x in 0..<M.count {
var range = NSRange(location:x * wordSize, length: wordSize)
chunk.getBytes(M[x], range:range)
}
(顺便说一下,同一行在之前版本的Swift中运行良好)
感谢您的任何见解!
答案 0 :(得分:4)
在Swift 1.1中运行的代码是(注意&
运算符):
chunk.getBytes(&M[x], range:range)
但是这确实不能用Swift 1.2编译。 您可以使用等效代码替换该行
withUnsafeMutablePointer(&M[x]) { chunk.getBytes($0, range:range) }
或使用临时变量
var tmp = UInt32(0)
chunk.getBytes(&tmp, range:range)
M[x] = tmp
让它再次运作。
但请注意,实际上根本不需要循环,而你的 代码可以简化为
let wordSize = sizeof(UInt32)
var M = [UInt32](count: 16, repeatedValue: 0)
chunk.getBytes(&M, length: M.count * wordSize)
编译Swift 1.1和1.2。