【问题标题】:How to call SecItemCopyMatching in Xcode 7 beta 4?如何在 Xcode 7 beta 4 中调用 SecItemCopyMatching?
【发布时间】:2015-10-11 11:56:49
【问题描述】:

在带有 Swift 的 Xcode 6 和 7 的早期版本中,这种语法可以工作:

    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...
    }

但是,SecItemCopyMatching 声明在 Xcode 7 beta 4 中发生了变化:

旧:func SecItemCopyMatching(_ query: CFDictionary, _ result: UnsafeMutablePointer&lt;AnyObject?&gt;) -&gt; OSStatus

新:func SecItemCopyMatching(_ query: CFDictionary!, _ result: UnsafeMutablePointer&lt;Unmanaged&lt;AnyObject&gt;?&gt;) -&gt; OSStatus

...现在secureItemValue 类型不匹配了。

之前提取结果的机制令人困惑,我希望新声明更容易,但我不知道如何为secureItemValue变量声明正确的类型并提取结果。

【问题讨论】:

    标签: ios swift xcode7 xcode7-beta4


    【解决方案1】:

    根据this answer,您可以在AnyObject 周围删除Unmanaged&lt;&gt;

    var secureItemValue: AnyObject?
    
    let statusCode: OSStatus = SecItemCopyMatching(keychainItemQuery, &secureItemValue)
    

    【讨论】:

      【解决方案2】:

      这适用于 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
          }
      

      【讨论】:

      • 很好,@Maximilian。一百万年都不会想到这一点!
      • 如果一个对象是可选的,它的默认值为nil,所以var dataTypeRef: AnyObject?var dataTypeRef: AnyObject? = nil是完全一样的
      • 是的,Maximilian 你是对的,我要删除我的评论。
      • 我觉得第一个语句可以简化为let status: OSStatus = SecItemCopyMatching(keychainQuery, &amp;dataTypeRef)
      猜你喜欢
      • 2015-10-25
      • 2015-10-17
      • 1970-01-01
      • 2015-10-28
      • 2015-10-17
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多