2016-05-01 127 views
1

我一直在寻找在谷歌的几个搜索结果和发现各种方式来测试NSStringnil的NSString:返回值或空字符串

所以我决定写一些category方法NSString到帮帮我。然而,它并没有像预期的那样工作,我想知道是否有人可以帮助我找出解决方案的原因和可能的帮助。

所以这是我想出了:

NSString+Extenstions.h

#import 

@interface NSString (Extensions) 

- (NSString *)stringOrNil; 
- (NSString *)stringOrEmpty; 

@end

NSString+Extenstions.m

#import "NSString+Extensions.h" 

@implementation NSString (Extensions) 

- (NSString *)stringOrNil { 
    return self == nil || [self length] == 0 ? nil : self; 
} 

- (NSString *)stringOrEmpty { 
    return [self stringOrNil] == nil ? @"" : self; 
} 

@end

所以后面stringOrEmpty的想法是给力的结果为空NSString(不nil )如果对象是nil或长度为0.

测试:

NSString *name = nil; 
NSLog(@"%@", [name stringOrEmpty]); // result: (null)

我所料,上面的结果是一片空白,但控制台登录它(null)。 S我将stringOrEmpty方法更改为return [[self stringOrNil] length] == 0 ? @"yes" : @"no";,预计会看到yes,但是又获得(null)。好像stringOrEmpty没有被调用。

最后,我测试了以下内容:NSLog(@"%@", [name class]);,结果又是(null)

我误会了什么吗?如果值为nil或真正为空,我如何编写一个可返回空白NSString值的类别?

谢谢!

+3

发送消息'nil'对象不会被调用。它只是返回零。您需要将它们定义为类方法。 – ozgur

+0

@ozgur啊,所以即使我将'name'定义为'NSString',给它'nil'死亡不允许调用'NSString'方法吗? – RoLYroLLs

+1

给nil的消息不做任何事情,并根据类型返回'nil,Nil,NULL,0或0.0'。所以是的,你是对的。 – ozgur

回答

2

nil不是NSString或任何对象的实例,因此您无法使用实例方法处理nil

nil的消息什么都不做,它甚至不会被调用。它只是简单地返回nil。您需要将其定义为类方法:

@interface NSString (Extensions) 

+ (NSString *)stringOrNil:(NSString *)string; 
+ (NSString *)stringOrEmpty:(NSString *)string; 

@end 

-

@implementation NSString (Extensions) 

+ (NSString *)stringOrNil:(NSString *)string { 
    return string.length ? string : nil; 
} 

+ (NSString *)stringOrEmpty:(NSString *)string { 
    return string ? string : @""; 
} 

@end 

这里是你如何称呼他们:

NSString *name = nil; 
NSLog(@"%@", [NSString stringOrEmpty:name]); // result: ("") 
+0

谢谢!像魅力一样工作! – RoLYroLLs

+0

'stringOrNil'方法有一个不必要的检查。只要'返回string.length?字符串:无;'。而'stringOrEmpty'应该是'返回字符串?字符串:@“”;'。 – rmaddy