He visto algunos ejemplos en torno al uso NSArray indexOfObjectPassingTest, pero no pude hacer que funcionen (que no volverían un índice válido). Así que ahora estoy intentando usar un bloque en línea. Lo hice tipificando un bloque, luego configurándolo como una propiedad, sintetizándolo e inicializándolo en el constructor. Sin embargo, ese tipo de información hace que todo el punto quede mudo, ya que podría crear fácilmente un método y usarlo en su lugar (menos tipeo, menos esfuerzo).La búsqueda de un índice de objeto en NSArray usando un bloque de línea
Lo que estoy tratando de lograr es algo a lo largo de este:
Observations *obs = [self.myAppointment.OBSERVATIONS objectAtIndex: ^NSInteger (NSString *keyword){
for (Observations *obs in self.myAppointment.OBSERVATIONS) {
if ([obs.TIME isEqualToString:keyword] == YES) return (NSInteger)[self.myAppointment.OBSERVATIONS indexOfObject:obs];
}
return (NSInteger)-1;
}];
Sin embargo Xcode simplemente no lo tendrá. He probado diferentes variaciones, pero declararlo en línea parece ser un problema, que es raro, porque como he dicho, typedefing, declarando, y sintetizando funciona así:
Observations *obs = [self.myAppointment.OBSERVATIONS objectAtIndex:findObs(keyword)];
Dónde está findObs de nuevo un bloque definido que hace lo mismo. ¿Es esto un problema de sintaxis, o me falta algo más importante?
Gracias que funcionaron muy bien. Por lo tanto, considero que pasar un bloque en línea como un parámetro NSInteger (esencialmente esperando que el valor de retorno del bloque se pase como parámetro) no es factible, a menos que su tipo esté definido y sintetizado. –
También puede llamar a su bloque en línea: '[... objectAtIndex: (^ NSInteger (NSString * k) {...}) (palabra clave)]; ', pero las cosas empezar a buscar un poco desordenado. –
Este ejemplo devolverá el último objeto que pasa la prueba en la matriz. Para detener la iteración tan pronto como se encuentre el primer objeto, debe establecer '* stop' en' SÍ' – Moose