微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在NSPredicate中将整数与字符串进行比较

如何解决在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"))

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

解决方法

问题在于,尽管您指定integerValue,但在将谓词用作提取的一部分时,CoreData会将您的字符串视为字符串。以字符串形式,10 weeks是“小于” 6 weeks,因此将其从结果中排除。

您应该存储数字(作为Int)而不是存储字符串。然后,为了显示目的,添加了文本“ weeks”。如果您存储数字而不是字符串,则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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。