【问题标题】:swift 2.0 keychain type errors for SecItemCopyMatchingSecItemCopyMatching 的 swift 2.0 钥匙串类型错误
【发布时间】:2015-09-03 14:10:30
【问题描述】:

我们在以前版本的 Swift 中使用了这个 sn-p 代码

    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()
        }
    }

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

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

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

我试过这个:

    let sizeOfKey = 32
    var store = NSMutableData(capacity: sizeOfKey)!
    let status = SecItemCopyMatching(keyChainQuery, store.bytes)

但这给了我一个:

无法转换“UnsafePointer”类型的值(又名 'UnsafePointer') 到预期的参数类型 'UnsafeMutablePointer'(又名 'UnsafeMutablePointer>') 错误

谁有想法?

【问题讨论】:

    标签: swift keychain swift2


    【解决方案1】:

    看来,我们不再需要Unmanaged&lt;&gt; 工作了。

    试试:

    var retrievedData: NSData?
    var extractedData: AnyObject?
    let status = SecItemCopyMatching(keyChainQuery, &extractedData)
    
    if (status == errSecSuccess) {
        retrievedData = extractedData as? NSData
    }
    

    【讨论】:

    • 似乎编译得很好!你能解释一下你是如何得出这个解决方案的吗?编译器想要一个: UnsafeMutablePointer> 但显然 AnyObject?也可以吗?
    • this document。我们可以将 in-out(&amp;) 表达式传递给UnsafeMutablePointer&lt;T&gt; 参数。当它接受UnsafeMutablePointer&lt;Optional&lt;AnyObject&gt;&gt; 时,如果resultOptional&lt;AnyObject&gt; 又名AnyObject? 变量,我们可以传递&amp;result
    【解决方案2】:

    在困惑了一些之后,我想出了这个解决方案:

        var retrievedData: NSData?
        let sizeOfKey = 32
        let store = UnsafeMutablePointer<AnyObject?>.alloc(sizeof(AnyObject?) * sizeOfKey)
        let status = SecItemCopyMatching(keyChainQuery, store)
    
        if (status == errSecSuccess) {
            retrievedData = NSData(bytesNoCopy: store, length: sizeOfKey, freeWhenDone: true)
        }
    

    编译。我不确定它是否真的有效。如果是这样,我会更新这篇文章。同时,如果知道的人可以对此发表评论,那就太好了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 2015-08-16
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      相关资源
      最近更新 更多