NSPredicate,带引号/不带引号

Posted

技术标签:

【中文标题】NSPredicate,带引号/不带引号【英文标题】:NSPredicate, with quotes / without quotes 【发布时间】:2011-07-06 14:24:31 【问题描述】:

在我的 iPhone 应用程序中,我正在读取一个 csv 文件。相关行是这样的:

NSString *countrycode = [[[NSString alloc] initWithFormat:@"%@", [arr objectAtIndex:2]] 
                                 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

这将返回“CN”(代表中国)。

当我这样做时:

NSLog(@"Manual: %@, country code: %@",@"CN",countryCode);

我明白了:

Manual: CN, country code: "CN"

一个有引号,另一个没有。我不知道这是为什么。

这让我绊倒的原因如下:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"countrycode == %@ ", @"CN"];

这工作正常,并从 Core Data 返回中国。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"countrycode == %@ ", countrycode];

这无法返回任何内容。我假设这是因为它周围有引号或其他东西,尽管我可能不正确。

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

实际上,格式化谓词以排除引号的正确方法是使用%K%@。见Predicate Format String Syntax。

【讨论】:

谢谢!你刚刚把我从 CloudKit NSPredicate 地狱中救了出来……【参考方案2】:

您的countryCode 变量在读回时必须在其中包含引号。第一次分配文字@"CN" 时,引号将被删除,因为它们指定您的变量是NSString。它们实际上并不在文字字符串中。如果您想在第一个 CN 中使用字符串,则需要明确指定引号,例如@"""CN"""

但是,如果你想去掉第二个字符串中的任何引号,你总是可以在将它放入谓词之前对字符串执行此操作:

[countryCode stringByReplacingOccurrencesOfString:@"""" withString:@""];

【讨论】:

嗯,不是我想要在第一个 CN 中引用引号,而是我不想在第二个 CN 中添加引号。我认为。因为它搞砸了 NSPredicate 调用。对吗? 当您对countryCode 进行NSLog 时,它是否包含引号? 是的,它无法从 Core Data 返回任何内容 我使用了:[countrycode stringByReplacingOccurrencesOfString:@"\"" withString:@""]; 而是这样做了。谢谢! @thekevinscott 很高兴听到! ;)

以上是关于NSPredicate,带引号/不带引号的主要内容,如果未能解决你的问题,请参考以下文章

将 MySQL 导出为 CSV,一些列带引号,一些不带引号

在表中插入带引号和不带引号的字符串部分

正则表达式将引号添加到不带引号的 CSV 列

Spring Boot - Json RequestBody,带/不带引号的字符串/枚举

创建类并在不带引号的情况下表示它

带/不带引号的 HTML 属性