用' 0'替换(null)全局,动态

时间:2013-05-07 11:12:30

标签: iphone ios objective-c

我继承的项目有很多带字符串值的变量。他们的唯一目的是帮助检查某些事情是真是假。在整个程序中为这些变量分配的值是:

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

有一种简单的方法可以确保,只要为其分配(null),就会自动为其分配0FALSE

那样if(...)条件会更容易处理。

4 个答案:

答案 0 :(得分:8)

首先,让我们解释一下0 / null / nil:

指向Objective-C对象的变量可以指向“无”。这有一个特殊值nil。该神奇值nil等同于数字0(在这种情况下,它被解释为内存位置0)。值NOfalse也会映射到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],除非非常非常在极少数情况下,你知道自己在做什么,因为它通常毫无意义。)

您的问题实际上是否可以在分配(null)时让Objective-C为字符串变量赋予特殊值。你不能这样做,这可能是显而易见的:(null)NSLog在你打印“没有”(nil)时给你的东西,即如果“没有”被分配到你的变量。您需要使用NSString上的方法相应地修改if语句,因为我刚才描述的是处理此问题的最佳方法(特别是如果有各种魔术值,如@"0",`@“虚假的“或任何可能发生的事情。”

修改:您已澄清要检查[NSNull null]。您现在可以执行以下操作:

if (myString == (id)[NSNull null] || [myString length] == 0) ... // (5), check for NSNull first!

或者如果您有魔术字符串值并希望采用类别方式:

if (myString == (id)[NSNull null] || ![myString isTrue]) ... // (6)

如果你想进入类别,你现在也可以像这样向NSNull添加isTrue

@interface NSNull (MyMagicValues)
- (BOOL)isTrue;
@end
@implementation NSNull (MyMagicValues)
- (BOOL)isTrue
{
    return NO;
}
@end

现在,NSStringNSNull都有一个isTrue,您可以再次进行简单检查(4)if (![myString isTrue]) ...。根据代码大小和复杂性,添加这两个类别可能有点难看......或者可能会大大改善您的代码。由你来决定。

答案 1 :(得分: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,{{1} }和我的NSNumber类别。

答案 2 :(得分:-1)

首先定义

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


NSString *str=@"your string";//may be null

if (STRING_IS_EMPTY_OR_NIL(str)) {
    NSLog(@"Null");
     str=@"0";

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

答案 3 :(得分:-1)

使用以下:

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