NSPredicate用于测试NULL和空字符串

77

我有一个NSArray,需要过滤掉其中任何为 null 或者是 ''(空字符串)的字符串。我该如何实现?我已经尝试了以下代码:

NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"(name!=nil)"]; 

但好像没有起作用。或许它确实起作用了,但有不同种类的空值...

4个回答

153
如果您不使用Core Data,可以这样做:
NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"name.length > 0"];
如果字符串是空的,这将失败(因为0 == 0)。同样,如果“name”是nil,它也会失败,因为[nil length] == 0。

87
注意使用CoreData时,不支持长度(length)操作,并且更糟糕的是会默默失败,返回奇怪的结果。CoreData将谓词name.length > 1翻译成sqlite中的name > 1... 而正确的翻译应该是 length(name) > 1 - Vincent Guerci
34
今天又被CoreData这个东西坑了一次...该死。有趣的是,我在寻找解决方法时,竟然发现了自己之前写的评论 :) - Vincent Guerci
@VincentG,对于Core Data谓词,您觉得使用正则表达式是否足够高效呢? - albertamg
8
@VincentG - 那么,CoreData 的解决方案是什么? - RyanJM
2
这非常危险。@VincentG是正确的。我有一个带有前导'/'字符的字符串,它不能与.length一起使用。我不得不像@josema.vitaminew发布的那样使用name!= nil AND name!='' - Stefan Arn
显示剩余10条评论

89

我认为这应该可以运作:

NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"name!=nil AND name!=''"]; 

3
这对于 Realm 数据库的谓词同样适用。谢谢。 - edhnb

14
 NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"name!=NULL"];

7
这个谓词对我有用:

这个谓词对我有用:

[NSPredicate predicateWithFormat:@"(%K== nil) OR %K.length == 0", @"imageUrl", @"imageUrl"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接