NSPredicate:怎么做不EndsWith?

hzx*_*zxu 6 arrays iphone filtering nspredicate ios

我在应用包中有一个图像列表,需要在应用中显示相应的图像,图像的格式为:

###_photo_#.jpg

###: toy id, from 1000 to 2000
#: photo id, from 1
Run Code Online (Sandbox Code Playgroud)

所以例如

1000_photo_1.jpg
1000_photo_2.jpg
Run Code Online (Sandbox Code Playgroud)

我曾经获取捆绑包中的文件列表并使用谓词来过滤掉其他文件:

@"self ENDSWITH '.jpg' AND self BEGINSWITH '%d_photo_'", toyId
Run Code Online (Sandbox Code Playgroud)

但现在有视网膜图像以@ 2x.jpg结尾,所以这个方法需要修复,我正在考虑添加:

NOT ENDSWITH '@2x.jpg'
Run Code Online (Sandbox Code Playgroud)

但这是对的吗?我应该说:

NOT (ENDSWITH '@2x.jpg')
Run Code Online (Sandbox Code Playgroud)

要么:

(NOT ENDSWITH '@2x.jpg')
Run Code Online (Sandbox Code Playgroud)

代替?

rob*_*off 8

您可以使用这样的谓词字符串:

@"(self ENDSWITH '.jpg') AND NOT (self ENDSWITH '@2x.jpg') AND (self BEGINSWITH '%d_photo_')"
Run Code Online (Sandbox Code Playgroud)


Jon*_*pan 5

您可以将谓词封装在另一个谓词中:

NSPredicate *positivePredicate = [NSPredicate ...];
NSPredicate *negativePredicate = [NSCompoundPredicate notPredicateWithSubpredicate: positivePredicate];
Run Code Online (Sandbox Code Playgroud)

这允许您保留现有的清晰格式字符串.请注意NSCompoundPredicate,您还可以构建AND和OR谓词.从这三个(AND,OR,NOT),您甚至可以得到像XNOR和NAND谓词这样的东西(尽管如何这样做是留给读者的练习......)


Jes*_*edc 1

我认为 iOS 4.0+ 中更好的选择是使用NSPredicate predicateWithBlock:来定义您的条件。这样你就可以使用标准的 NSString 函数来hasSuffix:检查你的结尾是否为负数。

在这里查看一个很好的教程:http://www.wannabegeek.com/?p =149

这是使用它的基本方法。

NSInteger toyId = 10;
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
  return [evaluatedObject hasSuffix:@".jpg"] &&
  ![evaluatedObject hasSuffix:@"@2x.jpg"] &&
  [evaluatedObject hasPrefix:[NSString stringWithFormat:@"%@_photo_", [NSNumber numberWithInt:toyId]]];
}];
Run Code Online (Sandbox Code Playgroud)

然后您可以获取文件数组

[arrayOfFiles filterArrayUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)