Что такое NSCFDictionary?

Я возвращаю NSCFDictionary, и я не могу понять, как его использовать. Я знаю это типа NSCFDictionary, потому что я напечатал класс, и он вышел как __NCSFDictionary. Я не могу понять, как с ним что-то сделать.

Я просто пытаюсь держаться за него пока, но не могу даже заставить это работать:

  NSDictionary *dict = [[NSURLCredentialStorage sharedCredentialStorage] allCredentials];
  for(NSURLProtectionSpace key in [dict keyEnumerator])
  {
         NSCFDictionary *value = [dict objectForKey:key];
  }

Ссылка на класс для allCredentials говорит, что предполагается, что он вернет словарь, значения которого также являются словарями. Однако мое выражение о назначении не работает. Нужен ли мне какой-нибудь отбор?

Ответ 1

NSDictionary и другие классы коллекций на самом деле кластеры классов: несколько классов конкретных подклассов маскируются под интерфейсом одного класса: все они обеспечивают ту же функциональность (поскольку они являются подклассами того же класса - в случае NSDictionary, это включает в себя три "примитивных метода" -count, -objectForKey: и -keyEnumerator), но при этом различные внутренние работы эффективны в разных ситуациях, основываясь на том, как они созданы и какие типы данных они могут хранить.

NSCFDictionary - это просто конкретный подкласс NSDictionary. То есть ваши NSDictionaries могут фактически быть экземплярами NSCFDictionary, но вы должны рассматривать их как экземпляры NSDictionary, поскольку это предоставит вам требуемый словарь- хранения.

NSDictionary *value = [dict objectForKey:key];

Теперь, еще одна причина, по которой ваш код не работает: NSURLProtectionSpace - это класс, поэтому вы должны использовать его как указатель, например:

for (NSURLProtectionSpace *key ...

Ответ 2

NSCFDictionary является частным подклассом NSDictionary, который реализует фактическую функциональность. Это просто NSDictionary. Почти любой NSDictionary, который вы используете, будет NSCFDictionary под капотом. Для вас это не имеет значения. Вы можете ввести переменную как NSDictionary и использовать ее соответствующим образом.

Ответ 3

У меня есть NSCFDictionary, который на самом деле является объектом NSMutableDictionary, я могу удалить из него элементы. Я упоминаю это, чтобы уточнить ответ jtbandes: объектом NSCFDictionary может быть любой объект, который наследуется от NSDictionary.