![](/img/trans.png)
[英]binary operator += cannot be applied to operands of type 'UnsafeMutablePointer<UInt8>?' and 'Int'
[英]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中, UnsafePointer
和UnsafeMutablePointer
的初始化UnsafeMutablePointer
,用於將Pointee類型轉換為Swift 2。 但在許多情況下,您可以在沒有指針類型轉換的情況下工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.