使用NSPredicate过滤 - 数据类型?

时间:2014-07-22 09:13:49

标签: xcode nspredicate

我希望使用谓词过滤数组,但我正在弯曲并正确处理数据类型。

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

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,但我无法过滤整数值,我该怎么办?

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

2 个答案:

答案 0 :(得分:0)

首先,在NSArray中存储数字的最佳方法是使用NSNumber个对象。您只需使用Objective-C literal syntax

NSInteger转换为NSNumber即可
[HospitalIDs addObject: @(1)]; 
[HospitalIDs addObject: @(2)]; 
[HospitalIDs addObject: @(3)];

然后你的谓词应该没有任何进一步的改变。

答案 1 :(得分:0)

有一个NSNumber类型包含一个对象中的int,float,bools,..

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