2015-07-21 2 views
7

В предыдущих версиях Xcode 6 и 7 с Swift, этот синтаксис будет работать:Как вызвать SecItemCopyMatching в Xcode 7 beta 4?

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:

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

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

... и теперь тип secureItemValue не совпадает.

Механизм сбивает с толку прежде, чем извлечь результат, и я надеюсь, что это будет как-то проще с новым объявлением, но я не знаю, как объявить правильный тип для переменной secureItemValue и извлечь результат.

ответ

16

Это работает на Xcode 7 бета 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 
    } 
+1

Ницца, @Maximilian. Не понял бы это через миллион лет! – Daniel

+0

Если объект не является обязательным, по умолчанию он равен нулю, поэтому 'var dataTypeRef: AnyObject?' И 'var dataTypeRef: AnyObject? = nil' то же самое – Maximilian

+0

Да Максимилиан, вы правы, я собираюсь удалить свой комментарий. – Neil

4

По this answer вы можете просто удалить Unmanaged<> вокруг AnyObject:

var secureItemValue: AnyObject? 

let statusCode: OSStatus = SecItemCopyMatching(keychainItemQuery, &secureItemValue) 
Смежные вопросы