2015-07-21 14 views
7

W poprzednich wersjach Xcode 6 i 7 z Swift, składnia ta będzie działać:Jak wywołać SecItemCopyMatching w 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... 
    } 

Jednak deklaracja SecItemCopyMatching zmieniło się w Xcode 7 beta 4:

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

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

... a teraz typ secureItemValue nie pasuje.

Mechanizm był mylący przed wyodrębnieniem wyniku i mam nadzieję, że jest to łatwiejsze dzięki nowej deklaracji, ale nie wiem, jak zadeklarować poprawny typ zmiennej secureItemValue i wyodrębnić wynik.

Odpowiedz

16

Działa to na 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 
    } 
+1

Nicea, @Maximilian. Nie wymyśliłbym tego przez milion lat! – Daniel

+0

Jeśli obiekt jest opcjonalny, jego wartość domyślna to nil, więc 'var dataTypeRef: AnyObject?' I 'var dataTypeRef: AnyObject? = nil' są dokładnie takie same – Maximilian

+0

Tak Maximilian masz rację, mam zamiar usunąć mój komentarz. – Neil

4

Według this answer można po prostu usunąć Unmanaged<> wokół AnyObject:

var secureItemValue: AnyObject? 

let statusCode: OSStatus = SecItemCopyMatching(keychainItemQuery, &secureItemValue) 
Powiązane problemy