ОК, это возможно, но это странно.Придется строить строку формата программно.В качестве альтернативы, мы могли бы построить все это путем создания отдельных NSExpression
объектов, но это было бы намного больше кода (хотя, вероятно, безопаснее, но неважно).
NSDate *maxDate = ...;
NSArray *arrayOfDates = ...; // an NSArray of NSDate objects
NSMutableArray *dateFormats = [NSMutableArray array];
for (NSDate *date in arrayOfDates) {
NSString *format = [NSString stringWithFormat:@"%f", [date timeIntervalSinceReferenceDate]];
[dateFormats addObject:format];
}
NSString *dateFormatString = [dateFormats componentsJoinedByString:@","];
NSString *format = [NSString stringWithFormat:@"CAST(max({%@}) = %%@, 'NSDate')", dateFormatString];
// format now looks like CAST(max({xxxx.xxxx, nnnn.nnnn, aaaa.aaaa, ....}), 'NSDate') = %@
NSPredicate *datePredicate = [NSPredicate predicateWithFormat:format, maxDate];
Трюк здесь заключается в использованииабсолютный временной интервал даты начиная с ссылочной даты в качестве аргументов функции max()
, а затем преобразовать результат , который , обратно в дату с помощью CAST()
.Более подробную информацию о том, как использовать функцию CAST()
с датами, можно найти в этом посте .