Widziałem „nowy typ” BOOL
( YES
, NO
).
Czytałem, że ten typ jest prawie jak char.
Do testów zrobiłem:
NSLog(@"Size of BOOL %d", sizeof(BOOL));
NSLog(@"Size of bool %d", sizeof(bool));
Dobrze widzieć, że oba dzienniki wyświetlają „1” (czasami w C ++ bool jest liczbą całkowitą, a jej rozmiar wynosi 4)
Zastanawiałem się więc, czy były jakieś problemy z typem bool czy coś takiego?
Czy mogę po prostu użyć bool (wydaje się, że działa) bez utraty prędkości?
c
objective-c
types
boolean
Francescu
źródło
źródło
bool
. Wszystkie frameworki Objective-C używająBOOL
.NSInteger progressTime = 2;//any value NSInteger totalTime = 1;//any value BOOL success = (progressTime>=totalTime)
// zawsze daje,NO
ale gdy już otrzymam tę(progressTime>=totalTime)
wartość dobool
typusuccess
, zwraca poprawny wynik. Nie rozumiem tego zachowania. Używam,Xcode 7.x
aiOS
wersja była8.x
. @BarryWarkJak wspomniano powyżej, BOOL jest podpisanym char. bool - typ ze standardu C99 (int).
BOOL - TAK / NIE. bool - prawda / fałsz.
Zobacz przykłady:
I wynik jest
Zauważ, że bool! = BOOL. Poniższy wynik to TYLKO PONOWNIE - PRAWDZIWE b2
Jeśli chcesz przekonwertować bool na BOOL, powinieneś użyć następnego kodu
W naszym przypadku:
A więc ... co teraz dostajemy? :-)
źródło
!!b1
. Konwersja między nimiW chwili pisania tego tekstu jest to najnowsza wersja objc.h:
Oznacza to, że na 64-bitowych urządzeniach iOS i na WatchOS
BOOL
jest dokładnie tak samo, jakbool
na wszystkich innych urządzeniach (OS X, 32-bitowy iOS),signed char
a nawet nie można go zastąpić flagą kompilatora-funsigned-char
Oznacza to również, że ten przykładowy kod będzie działał inaczej na różnych platformach (sam go przetestowałem):
BTW nigdy nie przypisuje takich zmiennych
array.count
doBOOL
zmiennych, ponieważ około 0,4% możliwych wartości będzie ujemnych.źródło
Typ C celu, którego należy użyć, to
BOOL
. Nie ma nic takiego jak rodzimy typ danych boolowskich, dlatego należy upewnić się, że kod kompiluje się na wszystkich kompilatorachBOOL
. (Jest to zdefiniowane w Apple-Frameworks.źródło
BOOL
jest zdefiniowany przez język Objective-C (znajduje się w jednym zobjc/*.h
nagłówków), a nie przez frameworki. Ponadto, podczas kompilacji z C99 (który moim zdaniem jest domyślny), istnieje natywny typ boolowski_Bool
(lubbool
jeślistdbool.h
jest uwzględniony).Tak, BOOL to typedef dla podpisanego znaku według objc.h.
Nie wiem jednak o bool. To jest C ++, prawda? Jeśli jest zdefiniowany jako znak podpisany, gdzie 1 to TAK / prawda, a 0 to NIE / fałsz, wyobrażam sobie, że nie ma znaczenia, którego użyjesz.
Ponieważ BOOL jest częścią Objective-C, prawdopodobnie bardziej sensowne jest użycie BOOL dla przejrzystości (inni programiści Objective-C mogą być zdziwieni, jeśli zobaczą bool w użyciu).
źródło
Kolejna różnica między bool i BOOL polega na tym, że nie konwertują one dokładnie tego samego rodzaju obiektów, gdy obserwujesz klucz-wartość lub kiedy używasz metod takich jak - [NSObject valueForKey:].
Jak wszyscy tu powiedzieli, BOOL jest char. Jako taki jest konwertowany na numer NSNumber zawierający znak. Ten obiekt jest nie do odróżnienia od numeru NSNumber utworzonego ze zwykłego znaku, takiego jak „A” lub „\ 0”. Całkowicie straciłeś informacje, że pierwotnie posiadałeś BOOL.
Jednak bool jest konwertowany na CFBoolean, który zachowuje się tak samo jak NSNumber, ale zachowuje boolowskie pochodzenie obiektu.
Nie sądzę, że jest to argument w debacie BOOL vs. bool, ale któregoś dnia może cię ugryźć.
Ogólnie rzecz biorąc, powinieneś używać BOOL, ponieważ jest to typ używany wszędzie w interfejsach API Cocoa / iOS (zaprojektowanych przed C99 i jego rodzimym typem bool).
źródło
Przyjęta odpowiedź została zredagowana, a jej wyjaśnienie stało się nieco niepoprawne. Próbka kodu została odświeżona, ale poniższy tekst pozostaje taki sam. Nie można zakładać, że BOOL jest na razie char, ponieważ zależy od architektury i platformy. Dlatego jeśli uruchomisz kod na platformie 32-bitowej (na przykład iPhone 5) i wydrukujesz @encode (BOOL), zobaczysz „c”. Odpowiada typowi char . Ale jeśli uruchomisz kod na iPhonie 5s (64-bitowym), zobaczysz „B”. Odpowiada typowi bool .
źródło
Tu sprzeciwiam się konwencji. Nie lubię typedefów do typów bazowych. Myślę, że to bezużyteczne pośrednictwo, które usuwa wartość.
źródło
size_t
), a zarównobool
(C99), jak iBOOL
(ObjC) należą do tej kategorii. A jeśli twój kod zawiódł z powodu zmiany typedef, to twój kod jest winny, ponieważ najwyraźniej nie traktowałeś typedef jako nieprzejrzystej rzeczy, ale polegałeś na jego implementacji na jednej platformie. (Zdarza się, że nie ma się czego wstydzić, ale to nie jest typedef do winy.)BOOL varname
zamiastchar varname
niej, bardziej oczywiste jest, że dwie poprawne wartości dla tej zmiennej totrue
/YES
lubfalse
/NO
.Jak wspomniano powyżej,
BOOL
może byćunsigned char
typem zależnym od architektury, podczas gdybool
jest typemint
. Prosty eksperyment pokaże różnicę, dlaczego BOOL i bool mogą zachowywać się inaczej:Ku twojemu zdziwieniu
if(objcBOOL != YES)
kompilator oceni na 1, ponieważ wYES
rzeczywistości jest to kod znakowy 1, aw oczach kompilatora kod znakowy 64 nie jest oczywiście równy kodowi znakowemu 1, więc instrukcja if będzie oceniać,YES/true/1
a następujący wiersz będzie biegać. Ponieważ jednakbool
typ zera zero zawsze zwraca wartość całkowitą 1, powyższy problem nie wpłynie na kod. Poniżej znajduje się kilka dobrych wskazówek, jeśli chcesz użyćObjective-C BOOL
typu vsANSI C bool
typ:YES
lubNO
i nic więcej.BOOL
typy, używając!!
operatora double not not , aby uniknąć nieoczekiwanych wyników.YES
użyciaif(!myBool) instead of if(myBool != YES)
znacznie czystsze jest użycie!
operatora not not operator i daje oczekiwany rezultat.źródło
Należy również pamiętać o różnicach w rzutowaniu, szczególnie podczas pracy z maskami bitowymi, ze względu na rzutowanie na podpisany znak:
Jeśli BOOL jest znakiem char zamiast bool, rzut 0x0100 na BOOL po prostu upuszcza ustawiony bit, a wynikowa wartość wynosi 0.
źródło