【问题标题】:How to return a dictionary through a `UnsafeMutablePointer<CFTypeRef?>?` parameter?如何通过 `UnsafeMutablePointer<CFTypeRef?>?` 参数返回字典?
【发布时间】: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
}

【问题讨论】:

    标签: ios swift xcode foundation


    【解决方案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 可以作为指针进行分配。

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2023-03-03
      • 2013-05-03
      • 1970-01-01
      相关资源
      最近更新 更多