2013-05-07 3 views
1

У проекта унаследованного есть много переменных, которые принимают строковые значения. Их единственная цель - помочь проверить, что-то истинно или ложно. Значения, присвоенные по всей программе переменных:Заменить (null) на «0» глобально, динамически

  • (null)
  • 0
  • any integer value > 0
  • true
  • false

Есть простой способ, чтобы убедиться, , когда a (null) назначается им, он автоматически получает вместо этого 0 или FALSE.

Таким образом, было бы намного легче справляться с условиями эксплуатации.

+1

Поймите, что 'nil',' null', 'NULL' и' FALSE' равны нулю. Единственный, на что вам действительно нужно обратить внимание, - это объект NSNull, который не будет сравнивать '==' с 'nil'. В разных схемах могут использоваться разные «истинные» значения - «1» является наиболее распространенным, но слово всех двоичных 1 также используется в некоторых контекстах (хотя и редко на языках C). Поэтому для сравнения «true» обычно лучше всего сравнивать для '! = 0','! = FALSE' или просто (немного странно) '!! theBoolVar'. Вам просто нужно следить за случаем NSNull и любыми схемами, которые могут быть возвращены -1 для «сбоя» и т. Д. –

+0

@HotLicks: Почему бы вам не написать ответ вместо этого? – DarkDust

+0

@DarkDust - Я слишком ленив, чтобы пропустить страницу так далеко. –

ответ

8

Во-первых, давайте кое-что объяснить о 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]) .... В зависимости от размера и сложности кода, добавление этих двух категорий может быть немного уродливым ... или может значительно улучшить ваш код. Вам решать это.

+0

Установка (null) в 0 глобально противоречила другим переменным, которые я не принял во внимание. Я в конце концов изменил свой код, чтобы назначить только 0s и 1s этим строкам. Делает все проще. – n00bProgrammer

-1

сначала определить

#define STRING_IS_EMPTY_OR_NIL(_STRING) (_STRING == nil || [str isEqualToString:@""]) 


NSString *[email protected]"your string";//may be null 

if (STRING_IS_EMPTY_OR_NIL(str)) { 
    NSLog(@"Null"); 
    [email protected]"0"; 

} 
else 
{ 
    NSLog(@"not Null"); 
} 
+1

'nil' ==' NULL' для всех практических целей. И, несмотря на название, вы не проверяете, является ли строка пустой. – DarkDust

+0

yes ... u может писать как #define STRING_IS_EMPTY_OR_NIL (_STRING) (_STRING == nil || [_STRING isEqualToString: @ ""]) –

-1

Использование ниже:

if (string == nil) 
    string = @"0"; 
2

Предполагая, что это вызвано использованием JSON, я разработал решение, используемый в приложении доставки, который работал большой.

Что я сделал, это создать категорию на NSNull и в зависимости от того, какое сообщение я получил, соответствующее значение.Например, в категории (без кода под руку, это из памяти):

-(int)intvalue { return 0; } 
-(BOOL) boolValue { return NO; } 
-(NSString *)description { return @""; } 
-(NSInteger)integerValue { return 0; } 
-(float)floatValue { return 0.0f; } 

В моем коде обработки, где дело с ObjectiveC объектов вернулись из JSON преобразования, я, как правило, всегда использую integerValue, так как он работает с обоими NSString, NSNumber и моей категорией NSNull.

Смежные вопросы