@NONAME8

Как работают вложенные функции?

Часто использую библиотеки и фреймворки, но до конца не понимаю как они работают.

Вопрос 1:
Как из функции можно доставать переменную, причем еще опциональную, а потом из нее еще доставать переменную
Я не представляю как это должно быть описано.

Например такое выражение:
Auth.auth().currentUser?.providerData[indexPath.row] ( пример из документации Firebase )


Вопрос 2:
Что в этом примере значит «?» после метода? Насколько я знаю метод может быть опционален только в @objc protocolи нигде больше, а тут что-то типа опциональго метода. Как такое может быть описано, да и вообще как работает ?

Пример:
if FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication) ?? false {
   return true
}
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
doublench21
@doublench21 Куратор тега Swift
Доброго времени суток. Вопрос немного странный.

Вопрос 1
Достаточно зайти вот сюда и обнаружить, что метод auth всего лишь возвращает инстанц класса FIRAuth Собственно все ваши currentUser тут присутствуют. Думаю теперь вопросов быть не должно.
spoiler
@implementation FIRAuth {
  /** @var _currentUser
      @brief The current user.
   */
  FIRUser *_currentUser;

  /** @var _firebaseAppName
      @brief The Firebase app name.
   */
  NSString *_firebaseAppName;

  /** @var _listenerHandles
      @brief Handles returned from @c NSNotificationCenter for blocks which are "auth state did
          change" notification listeners.
      @remarks Mutations should occur within a @syncronized(self) context.
   */
  NSMutableArray<FIRAuthStateDidChangeListenerHandle> *_listenerHandles;

  /** @var _keychain
      @brief The keychain service.
   */
  FIRAuthKeychain *_keychain;

  /** @var _lastNotifiedUserToken
      @brief The user access (ID) token used last time for posting auth state changed notification.
   */
  NSString *_lastNotifiedUserToken;

  /** @var _autoRefreshTokens
      @brief This flag denotes whether or not tokens should be automatically refreshed.
      @remarks Will only be set to @YES if the another Firebase service is included (additionally to
        Firebase Auth).
   */
  BOOL _autoRefreshTokens;

  /** @var _autoRefreshScheduled
      @brief Whether or not token auto-refresh is currently scheduled.
   */
  BOOL _autoRefreshScheduled;

  /** @var _isAppInBackground
      @brief A flag that is set to YES if the app is put in the background and no when the app is
          returned to the foreground.
   */
  BOOL _isAppInBackground;

  /** @var _applicationDidBecomeActiveObserver
      @brief An opaque object to act as the observer for UIApplicationDidBecomeActiveNotification.
   */
  id<NSObject> _applicationDidBecomeActiveObserver;

  /** @var _applicationDidBecomeActiveObserver
      @brief An opaque object to act as the observer for
          UIApplicationDidEnterBackgroundNotification.
   */
  id<NSObject> _applicationDidEnterBackgroundObserver;
}

Представить это можно так:
class Auth {
 class func auth() -> FIRAuth { ... }
 ...
}

class FIRAuth {
  var currentUser: FIRUser?
  ...
}

class FIRUser {
 var providerData: [Int : {что-то}]
 ...
}

Auth.auth().currentUser?.providerData[indexPath.row]


Вопрос 2
Кажется ещё более странным. Вы ведь знаете что такое опционал?! Тогда неужели Вы забыли, что метод может возвращать любое значение, в том числе и опционал. Теперь становится ясно, что с любым опционалом мы также можем применить опциональную цепочку, что собственно тут и было сделано.
FUIAuth.defaultAuthUI() возвращает опционал. Почему бы и не продолжить цепочку. Продолжаем:
FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication)
Но как не странно этот метод тоже возвращает опционал и мы просто хотим себя от этого обезопасить и сказать, что если на последнем методе тоже будет опционал, то верни правую часть, то бишь false. В итоге получаем общую картину:
FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication) ?? false
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы