Joj*_*dmo 4 unsafe-pointers core-foundation swift swift3 unsafemutablepointer
我试图SecItemCopyMatching在我的钥匙串实用程序类中调用,以便从钥匙串中获取数据,但我遇到了获取result参数的问题,UnsafeMutablePointer<CFTypeRef?>.
最初的声明(在Swift 2中,在迁移到Swift 3之前)是
// query is a dictionary of [String : AnyObject]
var result: Data?
let status = withUnsafeMutablePointer(to: &result) {
SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
}
Run Code Online (Sandbox Code Playgroud)
但是在Swift 3中,您现在需要调用.withMemoryRebound才能查看内存.基于Xcode告诉你的事情,我尝试了这个
var result: Data?
let status = withUnsafeMutablePointer(to: &result){
$0.withMemoryRebound(to: Data.self, capacity: 1){
SecItemCopyMatching(query as CFDictionary, UnsafePointer($0))
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这样做,我得到一个错误
无法将类型'
UnsafePointer<_>'的值转换为预期的参数类型'UnsafeMutablePointer<CFTypeRef?>?'
所以,我尝试使用CFTypeRef而不是Data
var result: CFTypeRef?
let status = withUnsafeMutablePointer(to: &result){
$0.withMemoryRebound(to: CFTypeRef.self, capacity: 1){
SecItemCopyMatching(query as CFDictionary, UnsafePointer($0))
}
}
Run Code Online (Sandbox Code Playgroud)
UnsafePointer($0)简单地替换会$0导致相同的错误消息.
如何UnsafeMutablePointer<CFTypeRef?>从钥匙串获取数据?
OOP*_*Per 10
在您的情况下,您不需要使用withMemoryRebound或withUnsafeMutablePointer(to:).
相反,你可以使用
var result: AnyObject?
let status = SecItemCopyMatching(query as CFDictionary, &result)
if status == noErr, let data = result as? Data {
//use data...
}
Run Code Online (Sandbox Code Playgroud)
通常,当您需要传递UnsafeMutablePointer<T>给函数时,声明一个类型的变量T并将其作为inout参数传递&variable.在你的情况下,T是CFTypeRef?和,在Swift 3中,CFTypeRef只是一个类型AnyObject.
即使在Swift 2.2中,您也不需要使用 withUnsafeMutablePointer
var result: AnyObject?
let status = SecItemCopyMatching(query, &result)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6103 次 |
| 最近记录: |