将整数与NSPredcate中的字符串进行比较



我在项目中有一系列锻炼程序(它们的代码在Objective-C上(,在每个程序中,我都有针对程序持续时间的@property (nullable, nonatomic, copy) NSString *scheduleStr;。此属性存储值,如1周2周周等。我需要筛选所有大于6周的值。我正在尝试应用NSPredcate:

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

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

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

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

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

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

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

破解方法是通过使用数字函数,如abs,迫使CoreData将字符串视为数字(假设你只有正数周,取绝对值会使值保持不变(:

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

要在您的情况下获得字符串中的整数部分,您可以查看以下内容:

假设元素是您的字符串,则

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

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

最新更新