2013-03-25 18 views

Odpowiedz

24

Co to jest condition? Czy jest to BOOL lub NSNumber?


Jeśli condition jest BOOL, to nie chcesz używać @NO lub @YES w ogóle.Chcesz powiedzieć

if (condition) // test if condition is true 

if (!condition) // test if condition is false 

if (condition == NO) // same as previous, based on personal preference 

pamiętać, że nigdy nie powinien powiedzieć

if (condition == YES) 

BOOL ponieważ w rzeczywistości nie jest ograniczony do 0 i 1 jako wartości, można go trzymać niczego w char, więc jeśli przypadkowo posiada condition powiedzmy: 3, a następnie if (condition) i if (condition == YES) zachowują się inaczej.


Jeśli condition jest NSNumber, to nadal nie chcą używać @NO i @YES. Po prostu chcesz przekonwertować go na BOOL wykorzystaniem -boolValue, jak w

if ([condition boolValue]) // test if condition is true 

if (![condition boolValue]) // test if condition is false 

if ([condition boolValue] == NO) // same as previous, based on personal preference 

Podstawowym wynos Oto, nie używaj @NO i @YES literały dla porównań. Jest bezcelowe i nieeleganckie, ponieważ wszystko, co możesz z nimi zrobić, zamienia je z powrotem na BOOL.

+0

Zwróć uwagę, że! Warunek i warunek == NO to ** nie ** to samo. Jest jeden przypadek na krawędzi. Powiedzmy, że warunek to 256. To spowoduje przepełnienie do 0 i będzie równe "NIE", ponieważ jest po prostu znakiem char. Jednak operator '!' Zwraca wartość logiczną C, która jest jawnie zdefiniowana przez standard C, aby była prawdziwa dla wszystkich wartości innych niż zero. Więc 'BOOL' będzie" NIE ", a' bool' będzie "prawdziwe" – borrrden

+0

Nieważne, powyższy przykład wydaje się działać sam. Sprawa, która mnie ugryzła, jest nieco inna. W niektórych przypadkach BOOL (a mianowicie 8-bitowe przepełnienie) (flaga) i (flaga == NIE) będą fałszywe. – borrrden

+0

Możesz również użyć notacji Objective-C 2.0 dla akcesorów dla boolValue – HAS

4

Zakładając typ danych condition jest BOOL, a chcesz:

if (condition) { 
    // true (YES) 
} else { 
    // false (NO) 
} 

Jeśli warunek jest NSNumber następnie użyć:

if ([condition boolValue]) { 
    // true (YES) 
} else { 
    // false (NO) 
} 

Jeśli condition opiera się na pewnych dowolnych liczb a następnie potraktować 0 jako NO i traktuj niezerowe jako YES.

Ponownie, jeśli condition jest NSNumber wtedy zrobić:

if ([condition intValue]) { 
    // non-zero - true (YES) 
} else { 
    // zero - false (NO) 
} 

Aktualizacja: W oparciu o następującym komentarzem OP:

stan jest bool, jak if (myView. frame.size.height == 30)

Oznacza to, że faktyczne pytanie o sprawdza coś takiego:

if ((myView.frame.size.height == 30) == YES) 

To bardzo nietypowe. Właściwą rzeczą jest:

if (myView.frame.size.height == 30) { 
    // true - height is 30 
} else { 
    // false - height is not 30 
} 

Nie musisz się martwić o fałszywe alarmy lub negatywy. Warunek jest prawdziwy lub nie jest. Nie ma trzeciej możliwości. Jeśli stan daje zły wynik, rozwiązaniem jest naprawienie tego stanu.

+0

Jakie numery uruchamiają @NO lub @YES? – zakdances

+0

Brak bezpośrednio. Jeśli 'warunek' jest utworzony z' [NSNumber numberWithBool:] ', to porównaj z' @ YES' lub '@ NO'. – rmaddy

+1

W porównaniu do "TAK" może być problematyczne w [niektórych przypadkach] (http://blog.bignerdranch.com/564-bools-sharp-corners/). I +1 dla nieużywania składni kropkowej dla wywołania metody innej niż właściwość. –

-2

Można użyć @YES.boolValue i @NO.boolValue.

Tak więc, aby porównać przeciwko bool dosłownym można napisać coś takiego (biorąc pod uwagę fakt, że condition jest BOOL)

if (condition == @NO.boolValue) { 
    // Do something 
} 
+0

Nie wiem, dlaczego to zostało odrzucone. Jeśli 'warunek' jest' NSNumber', a OP nie chce używać 'isEqual:', to jest to faktycznie możliwe rozwiązanie. – rmaddy

+3

Dlaczego kiedykolwiek mówiłeś "@ NO.boolValue" zamiast po prostu wypowiadać "NO"? –

+0

> Chcę używać literałów boolowych – anticyclope

-1

Czy conditionNSNumber? Jeśli tak, wystarczy użyć:

if(condition.integerValue) { 
    //condition is YES 
} else { 
    //condition is NO 
} 

A nawiasem mówiąc, wartość 0 oznacza brak jakiejkolwiek innej wartość TAK;

2

Możesz zapisać @NO w słowniku, ponieważ @NO jest obiektem. Nie możesz zapisać NO w słowniku. W razie potrzeby użyj @ NO.boolValue. Na przykład:

NSDictionary *userSetting = (NSDictionary *)[[NSUserDefaults standardUserDefaults] objectForKey:@"user"]; 
//Suppose you have done: userSetting[@"canWriteCode"] = @YES; 
if ([userSetting[@"canWriteCode"] boolValue]) 
    [self helloProgrammer];