¿Cómo se especifica el bloque objeto / predicado requerido por keysOfEntriesPassingTest de NSDictionary?

StackOverflow https://stackoverflow.com/questions/3034251

Pregunta

Para que el aprendizaje (no es práctico - sin embargo, los propósitos), me gustaría utilizar el siguiente método en un NSDictionary a Devuélveme un juego de llaves que tienen valores utilizando una prueba he definido. Desafortunadamente tienen ni idea de cómo especificar el predicado.

NSDictionary keysOfEntriesPassingTest:
- (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate

Vamos a decir, por ejemplo, todos mis valores son NSURLs, y me gustaría volver todas las direcciones URL que se encuentran en el puerto 8080. Aquí está mi puñalada en la codificación que - a pesar de que no tiene mucho sentido para mí que se 'd ser correcta:

NSSet * mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
                 if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
                     return key;
                 }]

Y eso se debe a que regrese el siguiente error del compilador:

  

tipos de puntero de bloque incompatibles inicialización 'vacío (^) (struct objc_object *, estructura objc_object *, BOOL *)', que se espera 'BOOL (^) (struct objc_object *, estructura objc_object *, BOOL *)'

¿Qué me falta? Te agradecería un puntero a algunos documentos que entrar en más detalles acerca de la "Bloquear objeto" que el predicado se supone que es.
Gracias!


Y este es el código que funciona:

NSSet *mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop)
{
  if ([[obj port] isEqual:[NSNumber numberWithInt: 8080]])
     return YES;
   else
     return NO;
}];
¿Fue útil?

Solución

El error indica que el bloque debe devolver un BOOL, en lugar de id. Compruebe la documentación. Sospecho que se espera para volver YES si la clave / obj par pasa la prueba deseada.

Otros consejos

Un poco de expansión en la respuesta de Barry ....

Un bloque es igual que un puntero de función con una diferencia clave. Un bloque inferirá el tipo de retorno de las declaraciones de retorno contenida dentro de o se le dará un mensaje de error como el que usted dijo (error del compilador LLVM debería ser un poco más razonable).

Cuando escribió:

NSSet * mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
                 if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
                     return key;
                 }]

Tenga en cuenta que en función:

BOOL bob(id key, id obj) {
    if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
        return key;
    }
}

Vea el problema? Hay una ruta de código que no devuelve un valor y, por lo tanto, el compilador se queja.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top