Swift 3中的UnsafeMutablePointer <CFTypeRef>

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

在您的情况下,您不需要使用withMemoryReboundwithUnsafeMutablePointer(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.在你的情况下,TCFTypeRef?和,在Swift 3中,CFTypeRef只是一个类型AnyObject.


即使在Swift 2.2中,您也不需要使用 withUnsafeMutablePointer

var result: AnyObject?  
let status = SecItemCopyMatching(query, &result)  
Run Code Online (Sandbox Code Playgroud)