2015-05-25 3 views
2

С помощью Xcode 6.3 Parse. рамки давали мне ошибки, поэтому я загружаю обновленную структуру Parse, и все начинает работать.PF_NULLABLE структура анализа синтаксиса трудно понять, отправив сообщение в PFUser

Теперь есть что-то новое, которое я пытаюсь понять, что такое метод logInWithUsername. Раньше он использовался довольно просто. Я вижу больше null при написании кода. И в какой-то момент меня путают, главным образом с указателем на указатель (т. Е. 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; 

Могу ли я что-то отсутствует на конфигурации или настроить для этой структуры?

ответ

3

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

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

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

Свифт эквивалент будет:

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, see this Stack Overflow answer.

Смежные вопросы