我在项目中有一系列锻炼程序(它们的代码在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
这将为您提供可用于筛选数组的字符串的整数部分。