SecItemCopyMatching的swift 2.0 keychain类型错误

Toa*_*oad 7 keychain swift swift2

我们使用以前版本的Swift获得了这段代码

    var retrievedData: NSData?
    var extractedData: Unmanaged<AnyObject>? = nil
    let status = SecItemCopyMatching(keyChainQuery, &extractedData)

    if (status == errSecSuccess) {
        if let validExtractedData = extractedData {
            let opaque = validExtractedData.toOpaque()
            retrievedData = Unmanaged<NSData>.fromOpaque(opaque).takeUnretainedValue()
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是现在这给我们带来了以下错误:

无法转换'inout Unmanaged'类型的值?(又名'inout Optional>')预期参数类型'UnsafeMutablePointer'(又名'UnsafeMutablePointer>')

我对如何修复它有点迷茫.我假设我必须分配一些内存,为它创建一个UnsafeMutablePointer,然后将其提供给SecItemCopyMatching?

我试过这个:

    let sizeOfKey = 32
    var store = NSMutableData(capacity: sizeOfKey)!
    let status = SecItemCopyMatching(keyChainQuery, store.bytes)
Run Code Online (Sandbox Code Playgroud)

但这给了我一个:

无法将'UnsafePointer'类型的值(又名'UnsafePointer <()>')转换为预期的参数类型'UnsafeMutablePointer'(又名'UnsafeMutablePointer>')错误

有人有想法吗?

rin*_*aro 26

看来,我们不再需要Unmanaged<>工作了.

尝试:

var retrievedData: NSData?
var extractedData: AnyObject?
let status = SecItemCopyMatching(keyChainQuery, &extractedData)

if (status == errSecSuccess) {
    retrievedData = extractedData as? NSData
}
Run Code Online (Sandbox Code Playgroud)

  • 见[本文件](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_16).我们可以将输入输出(`&`)表达式传递给`UnsafeMutablePointer <T>`参数.当它接受`UnsafeMutablePointer <Optional <AnyObject >>`时,如果`result`是一个`Optional <AnyObject>`又叫'AnyObject?`变量,我们可以传递`&result`. (3认同)