NSString:返回值或空字符串

时间:2016-05-01 19:36:34

标签: objective-c nsstring

我一直在查看几个Google搜索结果,并找到了各种方法来测试NSStringnil

所以我决定为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值的类别?

谢谢!

1 个答案:

答案 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: ("")