我一直在查看几个Google搜索结果,并找到了各种方法来测试NSString
等nil
。
所以我决定为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
或长度为0,则将结果强制为空nil
(不是nil
)。
测试:
NSString *name = nil;
NSLog(@"%@", [name stringOrEmpty]); // result: (null)
我预计,上面的结果是空白的,但控制台将其记录为(null)
。我将stringOrEmpty
方法更改为return [[self stringOrNil] length] == 0 ? @"yes" : @"no";
,并希望看到yes
,但又获得了(null)
。似乎没有调用stringOrEmpty
。
最后,我测试了以下内容:NSLog(@"%@", [name class]);
,结果又是(null)
。
我误解了什么吗?如果值为NSString
或真正为空,如何编写将返回空白nil
值的类别?
谢谢!
答案 0 :(得分: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: ("")