【问题标题】:Cast an NSDictionary value while applying an NSPredicate?在应用 NSPredicate 时强制转换 NSDictionary 值?
【发布时间】:2010-05-11 19:37:28
【问题描述】:

我有一个 NSDictionary 对象数组。 这些字典是从 JSON 文件中解析出来的。 NSDictionary 中的所有值对象都是 NSString 类型,一个键称为“distanceInMeters”。

我计划使用 NSPredicate 过滤这些数组,所以我开始这样:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(distanceInMeters <= %f)", newValue];
NSArray *newArray = [oldArray filteredArrayUsingPredicate:predicate];

如果“distanceInMeters”键的值是 NSNumber,我相信这会起作用,但是因为我从 JSON 文件中得到它,所以一切都是 NSStrings。 上面给出了这个错误:****** -[NSCFNumber length]: unrecognized selector sent to instance 0x3936f00***

这是有道理的,因为我刚刚尝试将 NSString 视为 NSNumber。

有没有办法在过滤时从字典中转换值,或者可能有一种完全不同的方法来解决这个问题?

希望有人可以帮助我:)

【问题讨论】:

    标签: cocoa nsdictionary nspredicate


    【解决方案1】:

    试试这个:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(distanceInMeters.floatValue <= %f)", newValue];
    

    【讨论】:

    • 嗨,荷马,谢谢你成功了:) 我不知道你可以像这样键入 cast,NSPredicates 对任何其他 NSManagedObjects 对我来说是新的东西:) 再次感谢
    • 仅供参考,这不是类型转换;它只是在 NSString 上调用“floatValue”方法。
    • 啊谢谢我明白了,当然是直接访问属性而不是访问器[NSString floatValue]:)
    • 不,它正在调用访问器。 NSString 没有可直接访问的“floatValue”属性。通常,NSPredicates 使用 valueForKey: 方法访问每个点分隔组件的内容。 valueForKey:如果可用则使用访问器,或者直接访问 not 的 ivar。仅仅因为谓词语法使用点并不意味着它正在使用属性。即使是这样,如果 NSString 有一个“floatValue”属性,访问它与调用 [thatString floatValue] 是相同的。
    • 这不适用于整数??尝试对 nsstring 属性进行谓词,但将其作为 int 进行比较。
    【解决方案2】:

    你的问题不在于谓词;您的问题是您正在处理 NSString 对象而不是处理 NSNumber 对象。我会先把时间集中在将它们更改为 NSNumbers,然后验证它是否不起作用。

    仅供参考,JSON Framework 会将数字自动解析为 NSNumbers...

    【讨论】:

    • 嗨,戴夫,谢谢,是的,我也希望处理正确的类型:) 我查看了我正在使用的 JSON 库,它确实会扫描数字。然后我尝试了这个: BOOL theBool = [[dict objectForKey:@"distanceInMeters"] isKindOfClass:[NSString class]]; NSLog(@"bool的值为%@\n", (theBool ?@"YES" : @"NO"));它回来了,所以毫无疑问。我正在使用 SBJSON 会不会是它根本不起作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多