无法为UnsafeMutablePointer类型< UInt8>类型调用初始值设定项 [英] Cannot invoke initializer for type UnsafeMutablePointer<UInt8>

查看:929
本文介绍了无法为UnsafeMutablePointer类型< UInt8>类型调用初始值设定项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将我的字符串转换为SHA256散列,但是我得到了下一个错误:

 无法调用初始值设定项for使用类型'(UnsafeMutableRawPointer)'

的参数列表输入'UnsafeMutablePointer< UInt8>'这就是我的功能:

  func SHA256(data:String) - >数据{
var hash = NSMutableData(length:Int(CC_SHA256_DIGEST_LENGTH))!如果让newData:Data = data.data(使用:.utf8){
let bytes = newData.withUnsafeBytes {(bytes:UnsafePointer< CChar>) - >

,无效
CC_SHA256(字节,CC_LONG(newData.length),UnsafeMutablePointer< UInt8>(hash.mutableBytes))
}
}

返回hash作为数据

$ / code>

所以,对于这部分

  UnsafeMutablePointer< UInt8>(hash.mutableBytes)

我得到这个错误:

 无法用类型为'(UnsafeMutableRawPointer)的参数列表调用类型为'UnsafeMutablePointer< UInt8& '

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


<您最好还是使用 Data 来得到结果 hash

解决方案

在Swift 3中, withUnsafePointer(_:) withUnsafeMutablePointer( :_)是泛型类型,当与格式良好的闭包一起使用时,Swift可以正确推断Pointee类型,这意味着您不需要将Point ee手动输入。



func withUnsafeBytes((UnsafePointer) - > ResultType)



func withUnsafeMutableBytes((UnsafeMutablePointer) - > ResultType)

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

如果让newData:Data = data.data(使用:.utf8){
_ = hash。 withUnsafeMutableBytes {$ mutableBytes
newData.withUnsafeBytes {bytes in
CC_SHA256(bytes,CC_LONG(newData.count),mutableBytes)
}
}
}

return hash
}

在Swift 3中, UnsafePointer UnsafeMutablePointer ,用于转换Pointee类型直到Swift 2,被删除。但在很多情况下,你可以在没有指针类型转换的情况下工作。


I'm trying to convert my string into SHA256 hash, but I get the next error:

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

That's my function:

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
}

so, for this part

UnsafeMutablePointer<UInt8>(hash.mutableBytes)

I get this error:

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

How can I fix that and what I do wrong?

解决方案

You'd better use Data also for the result hash.

In Swift 3, withUnsafePointer(_:) and withUnsafeMutablePointer(:_) are generic types and Swift can infer the Pointee types correctly when used with "well-formed" closures, which means you have no need to convert Pointee types manually.

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
}

In Swift 3, the initializers of UnsafePointer and UnsafeMutablePointer, which was used to convert Pointee types till Swift 2, are removed. But in many cases, you can work without type conversions of pointers.

这篇关于无法为UnsafeMutablePointer类型&lt; UInt8&gt;类型调用初始值设定项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆