В Facebook iOS SDK запросы возвращаются со следующим обработчиком:
^(FBRequestConnection *connection,
NSDictionary<FBGraphUser> *user,
NSError *error) { }
Затем к пользовательской переменной можно получить доступ с помощью таких вызовов...
self.userNameLabel.text = user.name;
self.userProfileImage.profileID = user.id;
Этот синтаксис несколько похож на синтаксис id <protocolDelegate> object
, который является общим объявлением свойства, за исключением того, что NSDictionary явно является объектом id, и этот словарь соответствует протоколу? Но откуда берется точечный синтаксис и как можно утверждать, что произвольный объект NSFoundation соответствует протоколу, не создавая подкласса самого объекта и не приводя его в соответствие?
Я провел дополнительное исследование о точечной записи и NSDictionary, и оказалось, что это невозможно использовать запись через точку в словаре без добавления категории в NSDictionary. Однако я не видел ссылок на синтаксис ‹> в Apple Documentation, чтобы указать, что этот конкретный экземпляр NSDictionary соответствует этой нотации.
И документация Facebook немного скудна о том, как работает эта упаковка:
Протокол FBGraphUser представляет наиболее часто используемые свойства объекта пользователя Facebook. Его можно использовать для доступа к объекту NSDictionary, который был обернут фасадом FBGraphObject.
Если следовать этому пути к документации FBGraphObject, то есть методы, которые возвращают словари, соответствующие этому "фасаду...", но нет дальнейших объяснений того, как оборачивать словарь.
Итак, я думаю, что у меня несколько вопросов:
- Как должен выглядеть базовый код, чтобы такой синтаксис работал?
- Почему он существует?
- Зачем Facebook реализовывать это таким образом, а не просто создавать объект, в который они могут конвертировать данные?
Любое объяснение или понимание будут очень признательны!