Сложно понять структуру синтаксического анализа 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 см. Ответ на переполнение стека.