Pregunta

Me acaba de comenzar el aprendizaje de Objective-C e hizo una pequeña aplicación brújula que mostrará una dirección cuando cae en una serie de partidas. Funciona muy bien, pero me pregunto si hay una manera más concisa de escribirlo usando NSRange. Después de mucho buscar, parece que NSRange se utiliza más para funciones de cadena en lugar de números.

he intentado hacer una instancia de NSRange mi punto de partida para hacer esto más concisa, no podía seguir la función que se encontraría si un número cae dentro de un NSRange.

Estoy en el camino correcto aquí, o estoy haciendo esto más detallado de lo que debe ser?

Gracias de antemano ..

Aquí estaba mi fallido punto de partida para tratar de acortar el código:

// If heading falls within this range, then display "S" for south    
NSRange eastenRange = NSMakeRange (80, 100); 
NSRange southernRange = NSMakeRange (170, 190); 
etc...

Aquí está mi código actual (funciona bien):

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateHeading:(CLHeading *)newHeading
{
 // Define and display the heading
 NSNumber *theHeading = [NSNumber numberWithInt:[newHeading trueHeading]];
 [headingLabel setText:[NSString stringWithFormat:@"%@°", theHeading]];

 // Define the range of directions
 NSNumber *northLowerRange = [NSNumber numberWithInt:10];
 NSNumber *northUpperRange = [NSNumber numberWithInt:350];

 NSNumber *eastLowerRange = [NSNumber numberWithInt:80];
 NSNumber *eastUpperRange = [NSNumber numberWithInt:100];

 NSNumber *southLowerRange = [NSNumber numberWithInt:170];
 NSNumber *southUpperRange = [NSNumber numberWithInt:190];

 NSNumber *westLowerRange = [NSNumber numberWithInt:260];
 NSNumber *westUpperRange = [NSNumber numberWithInt:280];


 // If the heading falls within the correct ranges, then display the direction
 if ([northLowerRange compare:theHeading] == NSOrderedDescending || [northUpperRange compare:theHeading] == NSOrderedAscending)
  [directionLabel setText:@"N"];
 else if ([eastLowerRange compare:theHeading] == NSOrderedAscending && [eastUpperRange compare:theHeading] == NSOrderedDescending)
  [directionLabel setText:@"E"];
 else if ([southLowerRange compare:theHeading] == NSOrderedAscending && [southUpperRange compare:theHeading] == NSOrderedDescending)
  [directionLabel setText:@"S"];
 else if ([westLowerRange compare:theHeading] == NSOrderedAscending && [westUpperRange compare:theHeading] == NSOrderedDescending)
  [directionLabel setText:@"W"];
 else
  [directionLabel setText:@"-"];

}
¿Fue útil?

Solución

  

estoy haciendo esto más detallado de lo que debe ser?

Sí. Cuando usted quiere hacer operaciones numéricas, evitar NSNumber. La clase NSNumber existe sólo porque colecciones de Objective-C como NSArray, etc. NSDictionary sólo pueden contener objetos Objective-C. De lo contrario, siempre se debe utilizar int liso o NSInteger o CGFloat o double etc.

 int heading = [newHeading trueHeading];
 headingLabel.text = [NSString stringWithFormat:@"%d°", heading];

 if (10 < heading || heading > 350)
    directionLabel.text = @"N";
 else if (80 < heading && heading < 100)
    directionLabel.text = @"E";
 // and so on.

No es necesario utilizar NSRange.

Otros consejos

El venir tarde a la fiesta, pero el siguiente iba a funcionar y hacer uso de rangos creo:

NSRange easternRange = NSMakeRange (80, 20); 
NSRange southernRange = NSMakeRange (170, 20); 

NSInteger heading = 92;
if (NSLocationInRange(heading,easternRange)) {
  NSLog(@"Heading Easterly.");
} else if (NSLocationInRange(heading,southernRange)) {
  NSLog(@"Heading southerly.");
}

etc. etc.

Una gama toma un lugar y una longitud. Así que si quieres 80 a 100 grados durante una cordillera oriental, se puede utilizar NSMakeRange (80, 20). Eso crearía un rango a partir de 80 grados, que abarca 20 grados.

Si estás interesado en un uso más integrado de la estructura NSRange, he encontrado que es útil para comparar porciones de matrices:

NSRange aRange = NSRangeFromString([NSString stringWithFormat:@"{0:%d}",items.count]);
NSIndexSet* aSet = [NSIndexSet indexSetWithIndexesInRange:aRange];
NSIndexSet *hasNotBeenReadSet = [items indexesOfObjectsAtIndexes:aSet
                                                          options:NSEnumerationConcurrent
                                                      passingTest:
                                  ^BOOL(BasicItem* obj, NSUInteger idx, BOOL *stop) {
                                    return [obj hasNotBeenRead];
                                  }];

int numberOfUnreadItems = hasNotBeenReadSet.count;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top