我继承的项目有很多采用字符串值的变量。他们的唯一目的是帮助检查某事是真是假。在整个程序中分配给这些变量的值是:
(null)
0
any integer value > 0
true
false
有没有一种简单的方法可以确保,每当将 a(null)
分配给他们时,它会自动分配给 a 0
or FALSE
。
这样if(...)
条件会更容易处理。
我继承的项目有很多采用字符串值的变量。他们的唯一目的是帮助检查某事是真是假。在整个程序中分配给这些变量的值是:
(null)
0
any integer value > 0
true
false
有没有一种简单的方法可以确保,每当将 a(null)
分配给他们时,它会自动分配给 a 0
or FALSE
。
这样if(...)
条件会更容易处理。
首先,让我们解释一下 0/null/nil:
指向 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
,您可以再次进行简单的检查(4):if (![myString isTrue]) ...
。根据代码大小和复杂性,添加这两个类别可能有点难看……或者可能会大大改善您的代码。由您决定。
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.
首先定义
#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");
}
下面使用:
if (string == nil)
string = @"0";