Comparación de No administrado <AnyObject> a cero

El código se copy de esta publicación del blog: http://matthewpalmer.net/blog/2014/06/21/example-ios-keychain-swift-save-query/

Solía ​​tener este código:

// Search for the keychain items let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef) // The following line crashes with an EXEC_BAD_ACCESS if dataTypeRef is nil var opaque = dataTypeRef!.toOpaque() 

Cuando ejecuto lo anterior utilizando un nuevo valor de count en la consulta de llavero, el dataTypeRef será nil que conduce a un EXEC_BAD_ACCESS .

Intenté sortear esto comprobando si dataTypeRef es nil como este:

 var opaque = COpaquePointer.null() if (dataTypeRef != nil) { opaque = dataTypeRef!.toOpaque() // This line should not be executed. } 

Mientras el depurador muestra que dataTypeRef es nil , seguirá ingresando la cláusula if y la falla.

¿Alguien podría explicar lo que está sucediendo aquí? Tengo experiencia en Objective-C pero no puedo entender qué está pasando aquí.

Por lo que sé, los bailes de toOpaque/fromOpaque ya no son necesarios, y puedes simplemente usar el enlace opcional. Esto se puede combinar con el yeso en NSData utilizando el encadenamiento opcional:

 let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef) if let retrievedData = dataTypeRef?.takeRetainedValue() as? NSData { contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding) } 

Tenga en count también que takeRetainedValue() es la opción correcta aquí porque "posee" el elemento devuelto por SecItemCopyMatching (tiene "Copiar" en su nombre).

Pero en realidad debería verificar primero el valor de retorno :

 let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef) if status == errSecSuccess { if let retrievedData = dataTypeRef?.takeRetainedValue() as? NSData { contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding) } }