1

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

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

有没有一种简单的方法可以确保,每当将 a(null)分配给他们时,它会自动分配给 a 0or FALSE

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

4

4 回答 4

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]

您的问题实际上是您是否可以让 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,您可以再次进行简单的检查(4)if (![myString isTrue]) ...。根据代码大小和复杂性,添加这两个类别可能有点难看……或者可能会大大改善您的代码。由您决定。

于 2013-05-07T11:30:00.753 回答
2

Assuming this is caused by using JSON, I developed a solution used in a shipping app that worked great.

What I did was create a category on NSNull and depending on what message I got returned the appropriate value. For instance, in the category (no code handy, this from memory):

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

In my processing code, where I deal with the ObjectiveC objects returned from JSON conversion, I tended to always use integerValue, since it works with both NSString, NSNumber, and my NSNull category.

于 2013-05-07T12:26:24.150 回答
-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");
}
于 2013-05-07T11:49:45.683 回答
-1

下面使用:

if (string == nil)
   string = @"0";
于 2013-05-07T12:16:23.863 回答