【发布时间】:2017-01-19 09:27:47
【问题描述】:
我试图在我的钥匙串实用程序类中调用 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))
}
但在 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))
}
}
但是这样做,我得到一个错误
无法将“
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))
}
}
将UnsafePointer($0) 替换为简单的$0 会导致相同的错误消息。
如何获得UnsafeMutablePointer<CFTypeRef?> 用于从钥匙串中获取数据?
【问题讨论】:
-
请您发布您创建查询的方式。我以前只是这样做并从 swift Dictionary 转换为 CFDictionary,但这在 Swift 3 中不再适用于我。如果我能看到更多的代码,我可以应用这个解决方案。
-
@TimSpears 您的代码的问题可能是字典必须是
[String : AnyObject]- 自动迁移器(对我而言)将其更改为[String : Any]。我更新了my answer to the question 以包含我使用的代码
标签: swift swift3 core-foundation unsafe-pointers unsafemutablepointer