Во-первых, давайте кое-что объяснить о 0/нуль/всухую:
переменная, которая указывает на объект Objective-C может указывать на «ничего». Для этого есть особое значение, nil
. Это магическое значение nil
эквивалентно числу 0 (которое в этом случае интерпретируется как ячейка памяти 0). Значения NO
и false
также отображаются в 0, поэтому 0 == nil == NULL == NO == false
(не совсем, но в большинстве случаев вы можете сделать это предположение).
Таким образом, вы можете проверить, является ли строка переменной указывает на «ничего», проверяя nil
:
if (myString == nil) ... // (1)
if (!myString) ... // (1.1), this is equivalent to (1) but implicit
Но вы обычно также хотите пустые строки (@""
) также следует рассматривать как «ничто» , Теперь вы можете сделать это:
if (myString == nil || [myString length] == 0) ... // (2)
Мы можем использовать специальное свойство Objective-C, чтобы сделать это еще короче: если вы вызываете метод на nil
он ведет себя как объект, который возвращает 0 все. Таким образом, нам не нужно, чтобы проверить nil
в этом случае:
if ([myString length] == 0) ... // (3), this is equivalent to (2)
Теперь, если у вас есть магические строковые значения, как @"FALSE"
, которые вы хотите проверить, я рекомендую вам создать категорию на NSString и добавить метод что объединяет эти тесты:
@interface NSString (MyMagicValues)
- (BOOL)isTrue;
@end
@implementation NSString (MyMagicValues)
- (BOOL)isTrue
{
// No need to test "self == nil" here, that cannot happen.
if ([self length] == 0) return NO;
if ([self isEqualToString:@"FALSE"]) return NO;
if ([self isEqualToString:@"0") return NO;
return YES
}
@end
хитрость здесь стоит помнить, что вызов этого на nil
возвратит 0/NO, поэтому значение по умолчанию должно быть NO.Теперь вы можете сделать:
if (![myString isTrue]) ... // (4)
Этот вариант будет справедливо, если myString
является:
nil
- пустая строка
@"FALSE"
@"0"
(Кстати, вы обычно получаете (null)
, когда вы делаете что-то вроде NSLog(@"%@", nil);
. Не проверить, является ли переменная [NSNull null]
за исключением очень, очень редкие случаи, когда вы знаете, что вы делаете, как это обычно это бессмысленно.)
Ваш вопрос действительно ли вы можете сделать Objective-C назначить специальный значение для строковой переменной, когда назначается (null)
. Вы не можете этого сделать, что уже может быть очевидно: (null)
- это то, что NSLog
дает вам, когда вы печатаете «ничего» (nil
), то есть если «ничего» не назначено вашей переменной. Вам необходимо будет изменить свои инструкции if
, используя метод NSString, как я только что описал, - лучший способ справиться с этим (особенно, если существуют различные магические значения, такие как @"0"
, `@" false "или что-то еще может произойти).
Редактировать: Вы уточнили, что хотите проверить на наличие [NSNull null]
. Теперь вы можете сделать что-то вроде:
if (myString == (id)[NSNull null] || [myString length] == 0) ... // (5), check for NSNull first!
или если у вас есть магические строковые значения и хотите перейти в категорию так:
if (myString == (id)[NSNull null] || ![myString isTrue]) ... // (6)
Если вы хотите идти в категорию путь теперь вы можете также добавить isTrue
к NSNull так:
@interface NSNull (MyMagicValues)
- (BOOL)isTrue;
@end
@implementation NSNull (MyMagicValues)
- (BOOL)isTrue
{
return NO;
}
@end
Теперь оба NSString
и NSNull
имеют isTrue
, и вы можете снова сделать простой гр heck (4) еще раз: if (![myString isTrue]) ...
. В зависимости от размера и сложности кода, добавление этих двух категорий может быть немного уродливым ... или может значительно улучшить ваш код. Вам решать это.
Поймите, что 'nil',' null', 'NULL' и' FALSE' равны нулю. Единственный, на что вам действительно нужно обратить внимание, - это объект NSNull, который не будет сравнивать '==' с 'nil'. В разных схемах могут использоваться разные «истинные» значения - «1» является наиболее распространенным, но слово всех двоичных 1 также используется в некоторых контекстах (хотя и редко на языках C). Поэтому для сравнения «true» обычно лучше всего сравнивать для '! = 0','! = FALSE' или просто (немного странно) '!! theBoolVar'. Вам просто нужно следить за случаем NSNull и любыми схемами, которые могут быть возвращены -1 для «сбоя» и т. Д. –
@HotLicks: Почему бы вам не написать ответ вместо этого? – DarkDust
@DarkDust - Я слишком ленив, чтобы пропустить страницу так далеко. –