Обрабатывать _Nonnull или Nullable с многоуровневым типом указателя
Как связать обнуляемые ключевые слова с многоуровневыми типами указателей в следующем объявлении для (NSError **)error
?
- (void)loadSessionForUserId:(nonnull NSString *)userId error:(NSError **)error {
...
}
Я хочу сделать ошибку обнуляемой и избавиться от “Pointer is missing a nullability type specifier (__nonnull or __nullable)”
2 ответа
Если вы получаете предупреждение или ошибку, если для проекта включена обработка-предупреждение-как-ошибка, в Xcode 9. Используйте этот формат для многоуровневых указателей:
Решение:
error:(NSError *_Nullable* _Nullable)error
Другие варианты ошибок:
а) с error:(NSError ** _Nonnull)error
Приводит к ошибке времени компиляцииNullability keyword 'nullable' cannot be applied to multi-level pointer type 'NSError *__autoreleasing *’
б) с error:(NSError * _Nonnull *)error
Приводит к ошибке времени компиляции Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
в) с error:(NSError ** _Nullable)error
Приводит к ошибке времени компиляции Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
Open Radar для NSError** без типа обнуляемости отображается как предупреждение, которое не может быть подавлено http://www.openradar.me/21766176
Если вы хотите добавить явную обнуляемость, вам нужно применить _Nullable
к внешнему (последнему) указателю. Но это значение по умолчанию для косвенных указателей, поэтому оно не должно быть необходимым. Ваш текущий код является правильным и предпочтительным.
- (void)loadSessionForUserId:(nonnull NSString *)userId error:(NSError ** _Nullable)error;