2011-03-07 37 views
15

我有一個非常基本的問題。我想知道這是Objective-C或C中的內置函數,以幫助我找到一個特定的數字是否在一定範圍內。我知道這可能是一個簡單的問題,但我仍然沒有找到答案。簡而言之,希望避免在此測試中使用多個「if」和「else」。如何使用Objective-C測試數字是否在範圍內?

回答

33
NSLocationInRange(c, NSMakeRange(a, (b - a)))

這會返回一個BOOL如果C位於內a和b。然而,a,b和c必須是無符號整型。這真的不是很好看。所以我想比較自己會好得多。

c >= a && c <= b
+0

謝謝,這是我需要的。 (NSRange) – 2011-03-07 18:03:49

+1

這是不完全正確的,被這個宏所壓制的代碼是 c> = a && c TtheTank 2015-10-07 11:01:52

13

使用C,C++,Java和C#做同樣的方式...

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

這是一個 「包容性」 範圍檢查。應該很容易弄清楚如何做一個「獨家」檢查。

沒有內置功能,但也沒有辦法做到這一點,比任何我熟悉的架構上的兩個條件更有效率。任何函數或宏將最終歸結爲與上述相同。

如果你擔心會變慢,那麼不要。如果你真的看到這是一個瓶頸,只擔心表現。過早優化不值得你花時間。

+0

+1對於「過早優化不值得你花時間」 – aslisabanci 2011-03-07 17:41:26

+0

我正在尋找像'if(x in range){}'這樣的範圍「,它是某種允許語句返回YES的結構,如果它的值在range.startInterval和range.endInterval之間。我不知道這樣的東西是否存在,但我認爲它值得問:) – 2011-03-07 17:42:57

+1

如果你真的想要,你可以使用'NSRange'和'NSLocationInRange()',但是在一天結束時,它只是圍繞着大於和小於檢查。沒有內置的'in'運算符或類似的東西。 – 2011-03-07 17:44:41

0

嗯,我不認爲有內置函數,但你可以在幾秒鐘內寫出你自己的函數。

簡單

return (theInt >= min && theInt <= max); 
2

添加這個方法:

- (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

只需要寫返回值(aFloat> = minValue && aFloat <= maxValue) -其他。 – taskinoor 2011-03-07 17:52:08

+0

不知道,我可以直接做到這一點。謝謝。 – 2011-03-07 17:55:47

0

否則,像這樣將被解釋爲:C> = A & &ç< b

NSLocationInRange(c, NSMakeRange(a, (b - a)))

如果你想比較像這樣:C> = A & &ç< = B 你應該這樣做像這樣:

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

如果您正在使用簽名的INT的工作,我建議你創建宏)

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

希望我幫助:)

乾杯;)!

0

在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"); 
} 
相關問題