Лучший способ реализовать истинную / ложную / неопределенную переменную трихотомии в target-c - PullRequest
2 голосов
/ 28 ноября 2010

Я вынужден использовать int и сделать 0 == NO, 1 == YES и все остальное == undefined. Очевидно, есть миллион способов сделать что-то подобное, но что кажется вам лучшим способом? Проблемы, о которых я могу подумать, включают в себя простоту и объем памяти (например, что, если у меня их много?).

Другой способ - использовать две BOOL, одну для isDefined и одну для value

Другой способ,

typedef enum { CPStatusUndefined, CPStatusAvailable, CPStatusUnavailable } CPStatus;

Редактировать, вариант использования:

У меня есть свойство yes / no, которое сложно рассчитать. Когда он проверяется, он часто проверяется (UIMenuController, OFTEN), но если пользователь не выберет его, он никогда не проверяется. Способ, который я выбрал для решения этой проблемы, - это переменная трех типов. При первой проверке, если она не определена, вы вычисляете значение да / нет и возвращаете его, после этого вы просто возвращаете значение да / нет.

Ответы [ 3 ]

5 голосов
/ 28 ноября 2010

Используйте перечисление. В Objective-C они работают так же, как в C / C ++

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

tri_type myVar = No;

if( myVar == Yes || myVar == Other ) {
  // whatever
}
1 голос
/ 28 ноября 2010

Как насчет NSNumber, так как это может быть nil?

[number boolValue] == YES;
[number boolValue] == NO;
[number boolValue] == nil; // or just number == nil
0 голосов
/ 28 ноября 2010

Если вы хотите сохранить наибольшее количество памяти, используйте символ.

char == 0, false char == 1, true else, undefined.

Очевидно, вы 'Я захочу инициализировать его как-то вроде -1. ​​

Так obj-c возвращает значения компаратора: если 0, они равны.если положительный, a> b, если отрицательный, a Та же идея, что и выше.

...