Можно ли использовать блок в качестве значения для notFoundMarker в iOS? - PullRequest
4 голосов
/ 07 февраля 2012

NSDictionary имеет следующую сигнатуру метода:

- (NSArray *)objectsForKeys:(NSArray *)keys notFoundMarker:(id)anObject;

Мои вопросы:

  1. Является ли nil разумным значением по умолчанию для notFoundMarker?
  2. Можно ли вернуть ключ (для которого значение не найдено) обратно как notFoundMarker?Это полезно, если ключ и значение были разными типами объектов, и позволяют узнать, чего еще не хватает.
  3. Может ли блок использоваться в качестве значения для notFoundMarker, будет ли он фактически выполняться?Или будет просто возвращен адрес выделенного стека блока?
  4. Какие действительно плохие вещи можно использовать в качестве значения для notFoundMarker?

1 Ответ

3 голосов
/ 07 февраля 2012
  1. Как указано в комментариях ниже, вы должны использовать [NSNull null]

  2. Вероятно, не без написания собственного метода-обертки или какой-либо категории для выполнения.этот.Тем не менее, если вы просто хотите узнать, какой ключ не был найден, вы можете просто посмотреть на массив ключей, который вы передали, так как индексы будут совпадать.

  3. ВыКонечно, можно использовать блок.Я не думаю, что он будет запущен.Это должно быть очень легко проверить (просто определите блок, который выводит что-то на консоль и попробуйте).

  4. Это действительно зависит от контекста и того, что вы делаете сделать с возвращенным массивом.Нет ничего плохого в том, чтобы поместить его в массив и вернуть, но я бы поставил под сомнение решение использовать все, что не соответствует типам объектов, которые вы ожидаете получить, для ключей, которые равны находится в NSDictionary.

РЕДАКТИРОВАТЬ: На самом деле вы, вероятно, можете достичь того, что вы хотите для 2. как это:

  NSMutableArray *objects = [myDictionary objectsForKeys:myKeys notfoundMarker:[NSNull null]];
  for (int ii = 0; ii < [objects count]; ii++ ) {
      if ([objects objectAtIndex:ii] == [NSNull null]) {
          [objects insertObject:[myKeys objectAtIndex:ii] atIndex:ii];
      }
  }
...