Сложно понять структуру синтаксического анализа PF_NULLABLE, отправив сообщение в PFUser

С Xcode 6.3 Parse. Фреймворк выдавал мне ошибки, поэтому я скачал обновленный фреймворк Parse и все заработало.

Теперь есть что-то новое, что я пытаюсь понять, что это за метод logInWithUsername является. Раньше это было довольно просто. Я вижу больше нуля при написании кода. И в какой-то момент я запутался, в основном с указателем на указатель (т.е. NSError).

[PFUser logInWithUsername:(NSString * __nonnull) 
                 password:(NSString * __nonnull) 
                    error:(NSError * __nullable __autoreleasing * __nullable)];

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

+ (PF_NULLABLE instancetype)logInWithUsername:(NSString *)username
                                     password:(NSString *)password
                                        error:(NSError **)error;

Я что-то упускаю на стороне конфигурации или настройки для этой платформы?

1 ответ

Решение

Со стороны Objective-C вы можете полностью игнорировать эти аннулируемые аннотации. Они предназначены исключительно для взаимодействия со Swift и позволяют ли Swift рассматривать объект как необязательный или необязательный вместо того, чтобы рассматривать все как неявно развернутый необязательный.

Если мы переведем ваш метод Objective-C:

[PFUser logInWithUsername:(NSString * __nonnull) 
                 password:(NSString * __nonnull) 
                    error:(NSError * __nullable __autoreleasing * __nullable)];

Эквивалент Swift будет:

PFUser.logIn(username: String, password: String, error: inout NSError?)

Суть этого заключается в следующем: метод не принимает nil для аргументов имени пользователя или пароля, но он ожидает необязательную ссылку на необязательный объект ошибки.

То есть не имеет значения, если ваш указатель nilили если на это указывает nil (оба могут быть nil). Метод разберутся.

Если вы вызываете метод и передаете nil для параметра ошибки вы передаете nil указатель. Если вы передаете неинициализированный NSError указатель (NSError *error = nil;), вы передаете неnil указатель на nil указатель на NSError объект.

Но опять же, если вы работаете с этой библиотекой со стороны Objective-C, вы можете полностью игнорировать это. Это работает так же, как и всегда. Это оказывает влияние только со стороны Swift, где компилятор строго относится к обнуляемости параметров.

Для получения дополнительной информации об аннотациях обнуляемости в Objective-C см. Ответ на переполнение стека.

Другие вопросы по тегам