使用 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 过滤 - 数据类型?的主要内容,如果未能解决你的问题,请参考以下文章