簡體   English   中英

無法為類型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可以正確推斷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的初始化UnsafeMutablePointer ,用於將Pointee類型轉換為Swift 2。 但在許多情況下,您可以在沒有指針類型轉換的情況下工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM