使用 NSPredicate 过滤 - 数据类型?

Posted

技术标签:

【中文标题】使用 NSPredicate 过滤 - 数据类型?【英文标题】:Filtering with NSPredicate - Data Type? 【发布时间】:2014-07-22 09:13:48 【问题描述】:

我希望使用谓词过滤数组,但我正被正确处理数据类型所困扰。

首先,我有一个要过滤的列表:

NSMutableArray *HospitalIDs = [[NSMutableArray alloc]init];
[HospitalIDs addObject: @"1"]; // Must be "id", int & NSInteger not accepted by XCode
[HospitalIDs addObject: @"2"]; // Must be "id", int & NSInteger not accepted by XCode
[HospitalIDs addObject: @"3"]; // Must be "id", int & NSInteger not accepted by XCode

其次,我有一个要使用上面的数组过滤的对象列表: (它被定义为 NSMutableArray *HospitalObjects 并预填充了 HospitalObjects)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.HospitalID IN %@", HospitalIDs];
[HospitalObjects filterUsingPredicate:predicate];

NSLog(@"%i",[HospitalObjects count]);

//The expected result is 3, but it prints 0.

为什么?

因为第一个数组包含 NSString 值,但我的 HospitalObject.HospitalID 是 int 类型。

我真的不想将我的对象定义中的 HospitalID 的数据类型更改为 NSString,但我无法过滤整数值,我该怎么办?

我可以在谓词语法中转换数据类型吗?怎么样?

【问题讨论】:

【参考方案1】:

首先,在NSArray 中存储数字的最佳方式是使用NSNumber 对象。您可以使用 Objective-C literal syntax 简单地将 NSInteger 转换为 NSNumber

[HospitalIDs addObject: @(1)]; 
[HospitalIDs addObject: @(2)]; 
[HospitalIDs addObject: @(3)];

那么您的谓词应该可以在没有任何进一步更改的情况下工作。

【讨论】:

【参考方案2】:

有一个类型NSNumber 将整数、浮点数、布尔值等包装在一个对象中。

NSMutableArray * hospitalIDs = [[NSMutableArray alloc] init];
[hospitalIDs addObject: @1]; // You can wrap an normal int into an NSNumber jusing @. In some siztuations you have to use @(yourOrdinaryValueTypeVariable)
[hospitalIDs addObject: @2];
[hospitalIDs addObject: @3];

顺便尝试使用CamelCase的正确命名:

类以大写开头:SomeClassName 小写的对象、变量和方法名称:`SomeClassName* someObject; 常量全部大写:MY_CONSTANT

【讨论】:

以上是关于使用 NSPredicate 过滤 - 数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 过滤核心数据中的对象

在 NSPredicate 中使用 NSNumber == nil 过滤值

NSPredicate的使用

带有核心数据对象的 NSPredicate

使用 Swift 过滤 Realm 对象

使用 NSPredicate 过滤后更新 UItableView 及其数据源的模式