如何通过 `UnsafeMutablePointer<CFTypeRef?>?` 参数返回字典?
Posted
技术标签:
【中文标题】如何通过 `UnsafeMutablePointer<CFTypeRef?>?` 参数返回字典?【英文标题】:How to return a dictionary through a `UnsafeMutablePointer<CFTypeRef?>?` parameter? 【发布时间】:2018-09-18 19:41:24 【问题描述】:对于测试,我创建了一个模拟类,它包装了 Security
框架函数。除了 我试图伪造 SecItemCopyMatching(_:_:)
之外,一切正常。完整的签名是:
func SecItemCopyMatching(_ query: CFDictionary, _ result: UnsafeMutablePointer<CFTypeRef?>?) -> OSStatus
我不想使用Security
框架的SecItemCopyMatching(_:_:)
,而是实现一个具有相同签名的虚拟对象,以便我自己进行测试。
以下sn-p来自the official documentation关于如何处理函数结果。我不知道如何通过UnsafeMutablePointer
以相同的方式呈现虚拟字典。我无法为指针分配任何内容,并且对 UnsafeMutablePointer<CFTypeRef?>?
感到困惑 - 这是指向指针的指针吗?
guard let existingItem = item as? [String : Any],
let passwordData = existingItem[kSecValueData as String] as? Data,
let password = String(data: passwordData, encoding: String.Encoding.utf8),
let username = existingItem[kSecAttrAccount as String] as? String
else
throw KeychainError.unexpectedPasswordData
【问题讨论】:
【参考方案1】:我找到的可行解决方案:
func SecItemCopyMatching(_ query: CFDictionary, _ result: UnsafeMutablePointer<CFTypeRef?>?) -> OSStatus
let item: [String: Any] = [
kSecAttrAccount as String: "username",
kSecValueData as String: "password".data(using: String.Encoding.utf8)!
]
result?.pointee = item as AnyObject
return copyMatchingStatus
他们需要理解的关键信息:CFTypeRef
直接映射到AnyObject
(请参阅Working with Core Foundation Types)。将字典转换为 AnyObject
可以作为指针进行分配。
【讨论】:
以上是关于如何通过 `UnsafeMutablePointer<CFTypeRef?>?` 参数返回字典?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 DBLINK 通过 DBLINK 调用 SELECT?
如何使用jquery通过.load通过跨域获取HTML元素的值
如何通过 Windows Azure 通过 GCM 通过唯一 ID 发送特定 Android 设备的通知?