gpt4 book ai didi

iphone - String isNullOrEmpty 作为类别

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:32:50 24 4
gpt4 key购买 nike

我正在尝试创建一个方法来检查 null/nil/空字符串,并且我试图让它作为一个类别工作,但没有成功。

我正在使用此代码,基于 this topic 中的答案:

@implementation NSString (NSStringExtension)
- (BOOL)isNullOrEmpty {
return self == nil ||
self == (id)[NSNull null] ||
[@"" isEqualToString:self] ||
[[self stringByReplacingOccurrencesOfString:@" " withString:@""] length] == 0||
[self isEqualToString:@"(null)"]
|| ([self respondsToSelector:@selector(length)] && [(NSData *) self length] == 0)
|| ([self respondsToSelector:@selector(count)] && [(NSArray *) self count] == 0)
|| [[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0;
}
@end

然而,当我尝试使用它时,我得到的是:

NSLog([@"" isNullOrEmpty] ? @"1":@"0"); // prints 1
NSString *s1 = nil;
NSLog([s1 isNullOrEmpty] ? @"1":@"0"); // prints 0
NSLog([args.itemName isNullOrEmpty] ? @"1":@"0"); // prints 0
NSLog([(NSString*)nil isNullOrEmpty] ? @"1":@"0"); // prints 0

这让我感到困惑,我只能假设 iOS5/ARC 的某种组合导致 nil 对象被强制转换为空白字符串/指针。调试器将字符串显示为 0x0,但当我使用我的 isNullOrEmpty 方法时,我得到 false。

最佳答案

return self == nil

这永远不会发生。如果您尝试发送 isNullOrEmpty (或任何其他消息)到 nil ,没有任何反应( objc_msgSend() ,负责消息发送的函数,检查 nil 接收者作为它做的第一件事,然后中止)。

self == (id)[NSNull null]

这也永远不会发生。如果你发送isNullOrEmpty到作为 NSNull 实例的对象,你的方法在这里,这是一个关于 NSString 的方法, 不会被调用。相反,NSNull的版本(可能不存在)将是。

同样,([self respondsToSelector:@selector(count)] && [(NSArray *) self count])永远不会发生。如果对象一个NSArray , 然后 isNullOrEmpty永远不会运行,因为,这又是一个 NSString 的方法.

相应地,[(NSData *) self length]不做你认为它做的事。 NSString实例确实响应length , 但将对象转换为 NSData不使用 NSData该方法的版本——它仍然以 NSString 结束。 length 的版本,因为对象实际上是一个NSString (转换只发生在编译时;它不能在运行时改变任何东西)。

[self isEqualToString:@"(null)"]

在这里您似乎正在检查 nil再次,但是您被 NSLog表示误导了打印时选择 nil :

NSLog(@"%@", nil);

这显示 (null)在控制台中,但这并不意味着对象本身是具有这些字符的字符串。 NSLog只需选择要为 nil 显示的字符串.*

您正在做的几件事需要将其归入 NSObject 的类别中,这样即使对象不是 NSString,该方法也会被调用 .

要检查仅由空格组成的字符串,您只需要与空字符串进行比较 @""修剪空格后:

NSString * trimmedSelf = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
// Then either:
[trimmedSelf isEqualToString:@""];
// Or:
([trimmedSelf length] == 0);

*更好的是,做 NSLog(@"%@", [NSNull null]);显示器 <null> (尖括号而不是圆括号),在你遇到的前几次很困惑 NSNull .

关于iphone - String isNullOrEmpty 作为类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9709304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com