如何解决在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 举报,一经查实,本站将立刻删除。