对于测试,我创建了一个包装Security
框架函数的模拟类。一切正常,除了我试图假装SecItemCopyMatching(_:_:)
。完整的签名是:
func SecItemCopyMatching(_ query: CFDictionary, _ result: UnsafeMutablePointer<CFTypeRef?>?) -> OSStatus
我不想使用SecItemCopyMatching(_:_:)
框架的Security
,而是实现一个具有相同签名的虚拟对象,供我自己进行测试。
以下片段来自the official documentation关于如何处理函数结果。我不知道如何通过qazxswpoi渲染一个虚拟词典以同样的方式使用。我无法为指针分配任何内容并且被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
}
它是一个指向变量的指针。
我发现的工作解决方案:
UnsafeMutablePointer<CFTypeRef> in Swift 3
他们需要了解的关键信息: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可以将赋值作为指针。