2010-11-28 29 views
2

Je suis tenté d'utiliser un int, et de faire 0 == NO, 1 == YES, et toute autre chose == indéfini. Évidemment, il y a un million de façons de faire quelque chose comme ça, mais qu'est-ce qui vous semble le meilleur? Les préoccupations auxquelles je peux penser comprennent la simplicité et l'empreinte mémoire (par exemple, que faire si j'en ai beaucoup?).Meilleure façon d'implémenter une variable de trichotomie vrai/faux/indéfini dans objectif-c

Une autre façon est d'utiliser deux BOOL, un pour isDefined, et un pour value

Une autre façon,

typedef enum { CPStatusUndefined, CPStatusAvailable, CPStatusUnavailable } CPStatus;

Modifier, le cas d'utilisation est la suivante:

J'ai oui/non propriété difficile à calculer. Quand il est en cours de vérification, on vérifie fréquemment (par UIMenuController, SOUVENT), mais à moins que l'utilisateur sélectionne, il est jamais vérifié. La façon dont j'ai choisi de traiter cela est une variable de type tri. La première fois que vous vérifiez, si elle est indéfinie, vous calculez la valeur oui/non et la renvoyez, après quoi vous retournez la valeur oui/non.

Répondre

5

Utilisez une énumération. En Objective-C, ils fonctionnent comme ils le font en C/C++

typedef enum { 
    No = 0, 
    Yes, 
    Other 
} tri_type; 

tri_type myVar = No; 

if(myVar == Yes || myVar == Other) { 
    // whatever 
} 
+2

@Kenny N'essayez pas d'être trop intelligent. Utilisez une énumération avec un nom agréable et significatif. – willc2

+0

@Kenny, +1 pour les noms significatifs. – Lee

1

Que diriez-vous NSNumber, car il peut être nil?

[number boolValue] == YES; 
[number boolValue] == NO; 
[number boolValue] == nil; // or just number == nil 
+1

si 'number' est' nil', puis '[numéro boolValue]' sera 'NO'. mieux vaut juste vérifier la variable elle-même. –

+0

-ce que les représentations booléennes ont réellement besoin d'être vrai/faux, ou est le cas d'une utilisation plus juste qu'il ya besoin d'être trois valeurs possibles (à savoir comme un 'enum')? Quel est exactement le cas d'utilisation? – d11wtq

+0

@Dave Désolé, totalement raté que vous n'étiez pas l'OP :) – d11wtq

0

Si vous voulez conserver la plus grande quantité de mémoire, utilisez char.

char == 0, faux char == 1, vrai autre, non défini.

De toute évidence, vous aurez envie de l'initialiser à quelque chose comme -1.

C'est le obj-c la façon dont le fait les valeurs de retour de comparaison: si 0, ils sont égaux. si positif, a> b si négatif, a < b

Même idée que ci-dessus.