如何通过 `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&lt;CFTypeRef?&gt;? 感到困惑 - 这是指向指针的指针吗?

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?>?` 参数返回字典?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过android上的ADB命令通过pc拨打电话?

如何通过 DBLINK 通过 DBLINK 调用 SELECT?

如何使用jquery通过.load通过跨域获取HTML元素的值

如何通过 Windows Azure 通过 GCM 通过唯一 ID 发送特定 Android 设备的通知?

如何通过方法(不是api)通过identityserver4获取访问令牌?

如何通过主机从外部通过 SSH 连接到 VirtualBox 来宾? [关闭]