2016-09-08 2 views
2

Я работал над добавлением аннотации с нулевым значением в часть файла заголовка, и я хотел, чтобы блок принимал ненулевые значения, но почти каждый метод впоследствии предупреждал о том, что мне нужно добавить значение nullability аннотаций.Предупреждения о недопустимости аннотации после NS_ASSUME_NONNULL_END

Пример кода для этого ниже:

NS_ASSUME_NONNULL_BEGIN 
- (void)testMethodWithParameter:(NSString *)par otherParameter:(NSString *)otherPar; 
NS_ASSUME_NONNULL_END 

- (void)methodThatShouldntNeedAnnotationWithText:(NSString *)txt; 
//Warning: Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) 

Могу ли я понимать эти макросы неправильно? Я думал, что это будет содержать ту часть, которая, как говорили, будет проверена в блоке BEGIN/END, но все, что было снаружи, все равно будет _Null_unspecified

Это работает так, как планировалось, или есть что-то, что я должен сделать, чтобы сделать эту работу Кстати, я думал?

+3

Я не знаю, если это намеренно или нет, но я тоже это заметил. Как только вы получите * любую аннотацию нулевой видимости в файле интерфейса, вы должны определить значение nulloid * везде * в этом файле. –

+0

По крайней мере, из моего впечатления о том, как это работает, похоже, что 'NS_ASSUME_NONNULL_END' ничего не делает в интерфейсе. Примерный код блога Apple Swift показывает 'BEGIN' перед' @ interface' и 'END' после' @ end' (для интерфейса). Возможно, он не предназначен для использования внутри интерфейса только для его части. – NickCE

ответ

1

NS_ASSUME_NONNULL_BEGIN делает любой параметр, чтобы считать, как не переменной нуль, поэтому:

NS_ASSUME_NONNULL_BEGIN 
- (void)testMethodWithParameter:(NSString *)par otherParameter:(NSString *)otherPar; 
NS_ASSUME_NONNULL_END 

преобразуется в:

- (void)testMethodWithParameter:(nonnull NSString *)par otherParameter:(nonnull NSString *)otherPar; 

Таким образом, отсутствие NS_ASSUME_NONNULL_BEGIN не означает, что каждый параметр предполагается, что nullable или unspecified, вы все равно должны определить его. Таким образом, для другого метода вы должны указать, что вы хотите, если вы хотите, чтобы текст мог быть nullable затем добавить ключевое слово к параметру, как это:

- (void)methodThatShouldntNeedAnnotationWithText:(nullable NSString *)txt; 
+0

И для 'testMethodWithParameter', что я хочу, но почему я получаю предупреждения о' methodThatShouldntNeedAnnotationWithText' после макроса 'NS_ASSUME_NONNULL_END'? – NickCE

+0

Что я имел в виду, вам нужно указать «нулеустойчивость» по вашим параметрам, вы можете достичь этого, используя «MACRO» или указав его по каждому параметру. – Fantini

+1

«МАКРО» влияет только на сигнатуры методов между «..._ BEGIN» и «..._ END», так что компилятор вам говорит, 'methodThatShouldnt ...' не имеет указателей на значение «nullability» – Fantini

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