无法调用 UnsafeMutablePointer 类型的初始值设定项 <UInt8>

Cannot invoke initializer for type UnsafeMutablePointer<UInt8>

我正在尝试将我的字符串转换为 SHA256 哈希,但出现下一个错误:

Cannot invoke initializer for type 'UnsafeMutablePointer<UInt8>' with an argument list of type '(UnsafeMutableRawPointer)'

这是我的职责:

func SHA256(data: String) -> Data {
    var hash = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH))!

    if let newData: Data = data.data(using: .utf8) {
        let bytes = newData.withUnsafeBytes {(bytes: UnsafePointer<CChar>) -> Void in
            CC_SHA256(bytes, CC_LONG(newData.length), UnsafeMutablePointer<UInt8>(hash.mutableBytes))
        }
    }

    return hash as Data
}

所以,对于这部分

UnsafeMutablePointer<UInt8>(hash.mutableBytes)

我收到这个错误:

Cannot invoke initializer for type 'UnsafeMutablePointer<UInt8>' with an argument list of type '(UnsafeMutableRawPointer)'

我该如何解决这个问题以及我做错了什么?

你最好也使用 Data 作为结果 hash

在Swift 3中,withUnsafePointer(_:)withUnsafeMutablePointer(:_)是泛型类型,Swift在与"well-formed"闭包一起使用时可以正确推断Pointee类型,这意味着您无需手动转换 Pointee 类型。

func withUnsafeBytes((UnsafePointer) -> ResultType)

func withUnsafeMutableBytes((UnsafeMutablePointer) -> ResultType)

func SHA256(data: String) -> Data {
    var hash = Data(count: Int(CC_SHA256_DIGEST_LENGTH))

    if let newData: Data = data.data(using: .utf8) {
        _ = hash.withUnsafeMutableBytes {mutableBytes in
            newData.withUnsafeBytes {bytes in
                CC_SHA256(bytes, CC_LONG(newData.count), mutableBytes)
            }
        }
    }

    return hash
}

在Swift 3中,删除了UnsafePointerUnsafeMutablePointer的初始值设定项,它们在Swift 2之前用于转换Pointee类型。但在很多情况下,您可以在不对指针进行类型转换的情况下工作。