我继承的项目有很多带字符串值的变量。他们的唯一目的是帮助检查某些事情是真是假。在整个程序中为这些变量分配的值是:
(null)
0
any integer value > 0
true
false
有一种简单的方法可以确保,只要为其分配(null)
,就会自动为其分配0
或FALSE
。
那样if(...)
条件会更容易处理。
答案 0 :(得分:8)
首先,让我们解释一下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]
,除非非常非常在极少数情况下,你知道自己在做什么,因为它通常毫无意义。)
您的问题实际上是否可以在分配(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
现在,NSString
和NSNull
都有一个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";