在 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"))
我在项目中有一系列锻炼计划(它们的代码在 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"))