In previous versions of Xcode 6 and 7 with Swift, this syntax would work:
var secureItemValue: Unmanaged<AnyObject>?
let statusCode: OSStatus = SecItemCopyMatching(keychainItemQuery, &secureItemValue)
if statusCode == errSecSuccess
{
let opaquePointer = secureItemValue?.toOpaque()
let secureItemValueData = Unmanaged<NSData>.fromOpaque(opaquePointer!).takeUnretainedValue()
// Use secureItemValueData...
}
However, the SecItemCopyMatching declaration has changed in Xcode 7 beta 4:
OLD: func SecItemCopyMatching(_ query: CFDictionary, _ result: UnsafeMutablePointer<AnyObject?>) -> OSStatus
NEW: func SecItemCopyMatching(_ query: CFDictionary!, _ result: UnsafeMutablePointer<Unmanaged<AnyObject>?>) -> OSStatus
...and now the secureItemValue type does not match.
The mechanism was confusing before to extract the result, and I'm hoping it is somehow easier with the new declaration, but I don't know how to declare the correct type for the secureItemValue variable and extract the result.
This works on Xcode 7 beta 4
var dataTypeRef: AnyObject?
let status: OSStatus = withUnsafeMutablePointer(&dataTypeRef) { SecItemCopyMatching(keychainQuery as CFDictionaryRef, UnsafeMutablePointer($0)) }
if status == noErr {
return dataTypeRef as? NSData
}
else {
return nil
}
According to this answer you can just remove Unmanaged<>
around AnyObject:
var secureItemValue: AnyObject?
let statusCode: OSStatus = SecItemCopyMatching(keychainItemQuery, &secureItemValue)
来源:https://stackoverflow.com/questions/31549059/how-to-call-secitemcopymatching-in-xcode-7-beta-4