Ios 从[NSArray valueForKeyPath:@";@max.value";]获取数据模型,而不仅仅是值

Ios 从[NSArray valueForKeyPath:@";@max.value";]获取数据模型,而不仅仅是值,ios,objective-c,nsarray,Ios,Objective C,Nsarray,以下是我的数据模型: @interface DataModel : NSObject @property (strong, nonatomic) NSString *label; @property (nonatomic) float value; @property (nonatomic) NSInteger index; @property (nonatomic, strong) NSString *unit; @end 我有一个数据模型的NSArray NSArray *myDataMo

以下是我的数据模型:

@interface DataModel : NSObject
@property (strong, nonatomic) NSString *label;
@property (nonatomic) float value;
@property (nonatomic) NSInteger index;
@property (nonatomic, strong) NSString *unit;
@end
我有一个数据模型的NSArray

NSArray *myDataModels;
现在我需要从这个数组中获取一个具有最高
@属性(非原子)浮点值的数据模型

我可以通过使用

[[myDataModels valueForKeyPath:@"@max.value"] intValue]
但我需要的是具有最高值的整个
DataModel
,而不仅仅是值


有人能帮我吗?

您需要迭代数组并找到最大值

DataModel *maxModel = nil;
float maxValue = FLT_MIN;
for (DataModel *model in myDataModels) {
    if (model.value > maxValue) {
        maxModel = model;
        maxValue = model.value;
    }
}

NSLog(@"The max model is %@", maxModel);

使用谓词的最小版本可以是

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.value ==%@.@max.value", myDataModels];
NSArray *filteredArray = [myDataModels filteredArrayUsingPredicate:predicate];
if(filteredArray.count>0)
    DataModel *smallestValue = [filteredArray objectAtIndex:0];
或者你也可以这样做(正如@Puneet在评论中建议的那样)


是的,使用迭代器绝对可以解决所有问题,但我的意思是只使用
[NSArray valueForKeyPath:@“@max.value”]
或类似的方法,但就这么简单。我不相信您可以使用KVC来获取对整个对象的引用。但我不是100%确定。一旦获得最大值,就可以使用NSPredicate获取与该最大值相关的数据模型。是否使用Predicate进行第二次搜索?因为我认为
valueForKeyPath
已经搜索了一次,如果我需要搜索两次才能从数组中获取元素,我宁愿使用迭代器。不过还是要谢谢你的帮助。事实上,你不能说哪种方法最好,因为它取决于很多因素。例如,数组中有多少数据?如果能够确认数据大小,则可以执行简单的负载测试。你可以随时比较和选择。更多关于NSPredicate的信息,它说它是一种查询语言,所以可能不会循环两次,但仍然不能确定。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.value == %@",[myDataModels valueForKeyPath:@"@max.value"]];
NSArray *filteredArray = [myDataModels filteredArrayUsingPredicate:predicate];
if(filteredArray.count>0)
    DataModel *smallestValue = [filteredArray objectAtIndex:0];