Gibt es einen Unterschied zwischen JA / NEIN, WAHR / FALSCH und wahr / falsch in Objective-C?

StackOverflow https://stackoverflow.com/questions/615702

  •  03-07-2019
  •  | 
  •  

Frage

Einfache Frage wirklich; gibt es einen Unterschied zwischen diesen Werten (und gibt es einen Unterschied zwischen BOOL und bool)? Ein Mitarbeiter erwähnt, dass sie auf verschiedene Dinge in Objective-C zu bewerten, aber wenn ich an den typedefs in ihren jeweiligen H-Dateien angesehen, YES / TRUE / true wurden alle als 1 definiert und NO / FALSCH / falsch waren alle definiert als 0. Gibt es wirklich einen Unterschied?

War es hilfreich?

Lösung

Es gibt keinen praktischen Unterschied zur Verfügung gestellt verwenden Sie BOOL Variablen wie booleans. C verarbeitet Booleschen Ausdrücken basierend darauf, ob sie auf 0 zu bewerten oder nicht 0. Also:

if(someVar ) { ... }
if(!someVar) { ... }

bedeutet dasselbe wie

if(someVar!=0) { ... }
if(someVar==0) { ... }

, weshalb Sie eine primitive Art oder Ausdruck als boolean Test auswerten können (einschließlich, zum Beispiel Zeiger). Beachten Sie, dass Sie sollten das ehemalige tun, letzteres nicht.

Beachten Sie, dass ist ein Unterschied, ob man BOOL Variable und Test für bestimmte Werte, so dass immer sie als booleans und nur stumpfe Werte zu einem sogenannten zuordnen sie von ihren #define Werte.

Wichtig ist, testen nie booleans ein Zeichen Vergleich mit - es ist nicht nur riskant, weil someVar einen Wert ungleich Null zugewiesen werden könnten, die nicht JA ist, aber meiner Meinung nach noch wichtiger ist, versagt es die Absicht richtig auszudrücken:

if(someVar==YES) { ... } // don't do this!
if(someVar==NO ) { ... } // don't do this either!

Mit anderen Worten, verwenden Konstrukte wie sie bestimmt sind, und dokumentiert verwendet werden und Sie finden sie in C aus einer Welt des Schmerzes ersparen.

Andere Tipps

Ich glaube, es ist ein Unterschied zwischen bool und BOOL Besuche diese Webseite eine Erklärung, warum:
http://iosdevelopertips.com/objective-c/of-bool-and -yes.html

Da BOOL ein unsigned char ist eher als eine primitive Art, Variablen vom Typ BOOL andere Werte als YES und NO enthalten können.

Betrachten Sie diesen Code ein:

BOOL b = 42;

if (b) {
    printf("b is not NO!\n");
}

if (b != YES) {
    printf("b is not YES!\n");
}

Die Ausgabe lautet:

  

b ist nicht nein!
  b ist nicht YES!

Für die meisten Menschen ist dies eine unnötige Sorge, aber wenn Sie wirklich einen boolean wollen, ist es besser, einen bool zu verwenden. Ich soll hinzufügen:. Das iOS SDK im Allgemeinen BOOL auf seinen Schnittstellendefinitionen verwendet, so dass ein Argument mit BOOL halten

Ich habe eine umfassende Prüfung zu diesem Thema. Meine Ergebnisse sprechen für sich sollte:

//These will all print "1"
NSLog(@"%d", true == true);
NSLog(@"%d", TRUE == true);
NSLog(@"%d", YES  == true);
NSLog(@"%d", true == TRUE);
NSLog(@"%d", TRUE == TRUE);
NSLog(@"%d", YES  == TRUE);
NSLog(@"%d", true == YES);
NSLog(@"%d", TRUE == YES);
NSLog(@"%d", YES  == YES);

NSLog(@"%d", false == false);
NSLog(@"%d", FALSE == false);
NSLog(@"%d", NO    == false);
NSLog(@"%d", false == FALSE);
NSLog(@"%d", FALSE == FALSE);
NSLog(@"%d", NO    == FALSE);
NSLog(@"%d", false == NO);
NSLog(@"%d", FALSE == NO);
NSLog(@"%d", NO    == NO);


//These will all print "0"
NSLog(@"%d", false == true);
NSLog(@"%d", FALSE == true);
NSLog(@"%d", NO    == true);
NSLog(@"%d", false == TRUE);
NSLog(@"%d", FALSE == TRUE);
NSLog(@"%d", NO    == TRUE);
NSLog(@"%d", false == YES);
NSLog(@"%d", FALSE == YES);
NSLog(@"%d", NO    == YES);

NSLog(@"%d", true == false);
NSLog(@"%d", TRUE == false);
NSLog(@"%d", YES  == false);
NSLog(@"%d", true == FALSE);
NSLog(@"%d", TRUE == FALSE);
NSLog(@"%d", YES  == FALSE);
NSLog(@"%d", true == NO);
NSLog(@"%d", TRUE == NO);
NSLog(@"%d", YES  == NO);

Die Ausgabe lautet:

2013-02-19 20:30:37.061 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.061 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.072 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.073 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.073 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.074 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.074 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.075 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.075 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.076 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.077 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.077 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.078 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.078 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.079 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.079 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.080 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.080 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.081 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.081 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.082 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.091 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.092 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.093 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.093 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.094 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.094 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.095 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.095 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.096 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.096 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.097 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.098 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.101 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.102 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.102 BooleanTests[27433:a0f] 0

Sie können die Antworten auf diese Frage lesen möchten. Zusammengefasst in Objective-C (aus der Definition in objc.h):

typedef signed char        BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#define OBJC_BOOL_DEFINED


#define YES             (BOOL)1
#define NO              (BOOL)0

Der Haupt (gefährlich!) Unterschied zwischen true und YESis in JSON Serialisierung.

Zum Beispiel haben wir JSON-Typ Serveranfrage und müssen wahr / falsch in json Sinn senden:

NSDictionary *r1 = @{@"bool" : @(true)};
NSDictionary *r2 = @{@"bool" : @(YES)};
NSDictionary *r3 = @{@"bool" : @((BOOL)true)};

Dann wandeln wir es String zu JSON vor dem Senden als

NSData *data = [NSJSONSerialization  dataWithJSONObject:requestParams options:0 error:nil];
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

Das Ergebnis ist

jsonString1 // {"bool":1}
jsonString2 // {"bool":true}
jsonString3 // {"bool":true}

Durch API Logik jsonString1 zu einem Fehler führen kann.

Seien Sie also vorsichtig mit booleans in Objective-C.

Um es zusammenzufassen, nur exakter @YES und gegossenen Wert als @((BOOL)expression) ist von __NSCFBoolean Typ und konvertierte mit JSON Serialisierung true. Alle anderen Ausdrücke wie @(expression1 && expression2) (auch @(YES && YES)) von __NSCFNumber (int) Art und umgewandelt in JSON 1.

P. S. Sie können einfach String-Wert boolean

verwenden
@{@"bool" : @"true"}; // in JSON {"bool":true}

Es gibt einen subtilen Fehler, niemand hier erwähnt, dass ich dachte, ich würde ... mehr von einem logischen Fehler als alles:

int i = 2;
if(i);        //true
if(i==YES);   // false
if((!!i)==YES); //true

so hier die Frage ist nur, dass (YES==1) und in C der Vergleich ist kein boolean einen, sondern ein basierend auf dem Wert.

da YES ist nur ein #define (eher als etwas intrinsische der Sprache), hat es einen gewissen Wert sein, und 1 am meisten Sinn macht.

Ich denke, sie fügen Sie JA / NEIN mehr selbsterklärend in vielen Fällen. Zum Beispiel:

[button setHidden:YES];

klingt besser als

[button setHidden:TRUE];

Lassen Sie uns zunächst prüfen, was wahr und falsch ist und was gibt ihnen in erster Linie bedeutet.

können wir eine Struktur aufzubauen aufgerufen, wenn ein dann b sonst c in Lambda-Kalkül wie folgt:

(\ifThenElse. <use if then else>)(\a. \b. \c. a b c)

In JavaScript Dies sieht wie folgt aus:

(function(ifThenElse) {
    // use ifThenElse
})(function(a) {
    return function(b) {
        return function(c) {
            return a(b)(c);
        };
    };
});

, um für ifthenelse nützlich sein, müssen wir eine Funktion „true“, die entweder rechts oder links wählen, und das tut, während der andere Option zu ignorieren, oder eine Funktion „false“, dass die Option „true“ wählt nicht nehmen.

Wir können diese Funktionen wie folgt definieren:

(\true. <use true>)(\a. \b. a) and (\false. <use false>)(\a. \b. b)

in JavaScript sieht es wie folgt aus:

(function(True) {
    // use True
})(function(a) {
     return function(b) {
         return a;
     }
});

(function(False) {
    // use True
})(function(a) {
     return function(b) {
         return b;
     }
});

Jetzt können wir tun, die folgende

(\true. \false. \ifThenElse. \doThis. \doThat. ifThenElse true doThis doThat)
(\a. \b. a)(\a. \b. b)(\a. \b. \c. a b c)(\a. ())(\a. ())

mit DoThis und doThat sein (\ a. ()), Weil Lambda-Kalkül keine Dienstleistungen wie Druck / math / Strings, alles, was wir tun können, ist nichts tun und sagen wir es getan haben (und später zu betrügen, indem sie zu ersetzen Dienstleistungen in unserem System, die Nebenwirkungen bieten wir wollen)

so wollen wir sehen, diese in Aktion.

(function(True) {
    return (function(False) {
        return (function(ifThenElse) {
            return (function(doThis) {
                return (function(doThat) {
                    return ifThenElse(True)(doThis)(doThat);
                });
            });
        });
    })
})(function(a) {
     return function(b) {
         return a;
     }
})(function(a) {
     return function(b) {
         return b;
     }
})(function(a) {
    return function(b) {
        return function(c) {
            return a(b)(c);
        };
    };
})(function(a) { console.log("you chose LEFT!"); })
(function(a) {console.log("you chose RIGHT");})();

Das ist eine tiefe Umgebung, vereinfacht werden könnten, wenn wir Arrays / maps / Argumente / oder mehr als eine Anweisung zu verwenden, um aufgeteilt in mehrere Funktionen erlaubt war, aber ich will, ist zu halten, so rein wie kann ich mich auf die Funktionen der Begrenzung genau ein Argument nur.

Beachten Sie, dass der Name True / False keine inhärente Bedeutung hat, können wir benennen sie leicht ja / nein, links / rechts, rechts / links, Null / Eins, Apfel / orange. Es hat Bedeutung, dass alles, was Wahl getroffen wird, ist es nur durch die Art des Chooser es geschaffen. Also, wenn „LEFT“ gedruckt wird, wissen wir, dass die Chooser nur wahr sein könnte, und basierend auf diesem Wissen können wir unsere weiteren Entscheidungen führen.

Um es zusammenzufassen

function ChooseRight(left) {
    return function _ChooseRight_inner(right) {
        return right;
    }
}
function ChooseLeft(left) {
    return function _ChooseLeft_inner(right) {
        return left;
    }
}

var env = {
    '0': ChooseLeft,
    '1': ChooseRight,
    'false': ChooseRight,
    'true': ChooseLeft,
    'no': ChooseRight
    'yes': ChooseLeft,
    'snd': ChooseRight,
    'fst': ChooseLeft
};
var _0 = env['0'];
var _1 = env['1'];
var _true = env['true'];
var _false = env['false'];
var yes = env['yes'];
var no = env['no'];

// encodes church zero or one to boolean
function lambda_encodeBoolean(self) {
    return self(false)(true);
}
// decodes a Boolean to church zero or one
function lambda_decodeBoolean(self) {
    console.log(self, self ? env['true'] : env['false']);
    return self ? env['true'] : env['false'];
}

lambda_decodeBoolean('one' === 'two')(function() {
    console.log('one is two');
})(function() {
    console.log('one is not two');
})();

lambda_decodeBoolean('one' === 'one')(function() {
    console.log('one is one');
})(function() {
    console.log('one is not one');
})();

Nein, JA / NEIN ist eine andere Art und Weise zu WAHR / FALSCH (1/0) zu beziehen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top