NSString: Return 值或空字符串

NSString: Return value or Empty string

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

所以我决定为 NSString 编写一些 category 方法来提供帮助。但是它没有按预期工作,我想知道是否有人可以帮助我找出原因并提供可能的解决方案帮助。

这就是我想出的:

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 背后的想法是如果对象是 nil 或长度为 0,则强制结果为空 NSString(而不是 nil)。

测试:

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 或真正为空,我如何编写一个 return 空白 NSString 值的类别?

谢谢!

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

发给 nil 的消息什么都不做,甚至都不会被调用。它只是简单地 returns nil。您需要将它们定义为 class 方法:

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