7

以前のバージョンの Xcode 6 および 7 と Swift では、次の構文が機能します。

    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 ベータ 4 で変更されました。

年: func SecItemCopyMatching(_ query: CFDictionary, _ result: UnsafeMutablePointer<AnyObject?>) -> OSStatus

新着: func SecItemCopyMatching(_ query: CFDictionary!, _ result: UnsafeMutablePointer<Unmanaged<AnyObject>?>) -> OSStatus

...そして、secureItemValue タイプが一致しません。

以前は結果を抽出するメカニズムがわかりにくかったので、新しい宣言で何とか簡単になることを願っていますが、secureItemValue 変数の正しい型を宣言して結果を抽出する方法がわかりません。

4

2 に答える 2

18

これは 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
    }
于 2015-07-21T21:49:48.637 に答える
4

この回答によるとUnmanaged<>、 AnyObject の周りを削除するだけです:

var secureItemValue: AnyObject?

let statusCode: OSStatus = SecItemCopyMatching(keychainItemQuery, &secureItemValue)
于 2015-11-23T14:49:10.737 に答える