在 NSPredicate 中比较整数和字符串

Compare integer with string in NSPredicate

我在项目中有一系列锻炼计划(它们的代码在 Objective-C 上)并且在每个计划中我都有 @property (nullable, nonatomic, copy) NSString *scheduleStr; 计划持续时间。 属性 存储 1 周2 周3 周 等值. 我需要过滤所有大于 6 周的值。我正在尝试应用 NSPredicate:

predicates.append(NSPredicate(format: "scheduleStr.integerValue >= 6"))

在此之后,我只收到长度为 6-9 周的程序,但不会超过 10 周,但可以肯定的是,我在数据库中有几个长度等于 12 周的程序。 如果我尝试应用这样的东西:

predicates.append(NSPredicate(format: "scheduleStr.integerValue >= 10"))

几乎所有节目我都会收到。如何获取所有超过选定值的程序?

要在您的案例中获取字符串中的整数部分,您可以查看如下内容:

然后假设元素是你的字符串

let component = element.components(separatedBy: .letters) // this will give you the non letter values 
let integerValues = component.filter({ [=10=] != "" }) 
print(integerValues[0]) // As first value in your input string is an integer

这将为您提供可用于过滤数组的字符串的整数部分。

问题在于,尽管您指定了 integerValue,但在将谓词用作提取的一部分时,CoreData 会将您的字符串视为字符串。在字符串术语中,10 weeks“小于”6 weeks,因此它被排除在结果之外。

您应该存储数字(作为 Int)而不是存储字符串。添加文本“weeks”是为了显示目的而做的事情。如果您存储数字而不是字符串,那么 CoreData 可以进行数值比较,您的谓词将按预期工作。

如果您真的不想这样做,有一种变通方法和一种破解方法。解决方法是过滤内存中的对象而不是作为提取的一部分。然后 integerValue 将被正确解释并且比较将是数字。

破解方法是强制 CoreData 将您的字符串视为数字,方法是使用数字函数,例如 abs(假设您只有正数的周数,取绝对值值不变):

predicates.append(NSPredicate(format: "abs:(scheduleStr) >= 6"))