Как проверить, находится ли число в диапазоне, используя Objective-C? - PullRequest
16 голосов
/ 07 марта 2011

У меня очень простой вопрос.Я хотел бы знать, есть ли встроенная функция в Objective-C или C, чтобы помочь мне найти, находится ли конкретное число в определенном диапазоне.Я знаю, что это, вероятно, простой вопрос, но все же я не нашел ответа.В короткие сроки, мы хотели бы избежать использования нескольких «if» и «else» для этого теста.

Ответы [ 6 ]

35 голосов
/ 07 марта 2011
NSLocationInRange(c, NSMakeRange(a, (b - a)))

Возвращает BOOL, если c лежит в пределах a и b.Однако a, b и c должны быть без знака int.И это действительно не очень хорошо выглядит.Поэтому я думаю, что гораздо лучше сравнивать себя.

c >= a && c <= b
13 голосов
/ 07 марта 2011

То же, что вы делаете в C, C ++, Java, C # ...

if (theNumber >= SOME_MINIMUM_VALUE && theNumber <= SOME_MAXIMUM_VALUE)
{
    // ...
}

Это «инклюзивная» проверка диапазона.Должно быть легко понять, как сделать «эксклюзивную» проверку.

Нет встроенной функции, но также нет способа сделать это более эффективным, чем два условия в любой архитектуре, с которой я знаком.Любая функция или макрос в конечном итоге сводятся к тому же, что и выше.

Если вы беспокоитесь, что это будет медленно, то не .Заботьтесь о производительности, только если вы действительно видите, что это как-то узкое место.Преждевременная оптимизация не стоит вашего времени.

2 голосов
/ 07 марта 2011

Добавьте этот метод:

- (BOOL)float:(float)aFloat between:(float)minValue and:(float)maxValue {
    if (aFloat >= minValue && aFloat <= maxValue) {
        return YES;
    } else {
        return NO;
    }
}

И используйте это так:

float myFloat = 3.45;
if ([self float:myFloat between:3 and:4]) {
    //Do something
}

Это очень простое решение.

0 голосов
/ 26 мая 2015

В Objective-C вы можете использовать эту простую проверку:

if (variable >= MINVALUE && variable <= MAXVALUE) {
    NSLog(@" the number fits between two numbers");
} else {
    NSLog(@" the number not fits between two numbers");
}

BOOL FitsBetweenTwoNumber = NSLocationInRange(variable, NSMakeRange(MINVALUE, (MAXVALUE - MINVALUE)));
if (FitsBetweenTwoNumber) {
    NSLog(@" the number fits between two numbers");
} else {
    NSLog(@" the number not fits between two numbers");
}

вы можете использовать NSPredicate, чтобы определить, находится ли массив в диапазоне, если вы используете CoreData, выполните:

NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", MINVALUE, MAXVALUE];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:context]];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];

if (error == nil) {
    if(results.count >0) {
        NSLog(@" the number fits between two numbers");
    } else {
        NSLog(@" the number not fits between two numbers");
    }
} else if (error) {
    NSLog(@"%@", error);
}

если вы не используете coreData, вы также можете использовать NSPredicate:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", MINVALUE, MAXVALUE];

NSArray *results = [@[@(variable)] filteredArrayUsingPredicate:predicate];
if(results.count >0) {
    NSLog(@" the number fits between two numbers");
} else {
    NSLog(@" the number not fits between two numbers");
}
0 голосов
/ 07 апреля 2014

Подобные действия будут интерпретироваться как: c> = a && c NSLocationInRange(c, NSMakeRange(a, (b - a))) Если вы хотите сравнить так: c> = a && c <= b Вы должны сделать так: </p> NSLocationInRange(c, NSMakeRange(a, (b - a) + 1)) NSRange - это структура:

{
  location,    // Starting point
  length       // Length from starting point to end range 
}

Так что если вы хотите, чтобы диапазон от 5 до 15 включался -----> NSMakeRange (5, 11);

* Если вы немного обеспокоены, просто считайте пальцем от 5 до 15;).Вот как я поступаю, когда добираюсь до этой ночной точки, когда трудно думать: p

Если вы работаете с Signed int, я советую вам создать макрос;)

#define MY_AWESOME_MACRO_COMPARE(c, a, b) ((c >= a) && (c <= b))

Надеюсь, я помог:)

Ура;)!

0 голосов
/ 07 марта 2011

Ну, я не верю, что есть встроенная функция, но вы можете написать свою собственную за считанные секунды.

просто

return (theInt >= min && theInt <= max);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...