2016-09-08 40 views
2

我正在爲頭文件的一部分添加一些空性註釋,並且我希望該塊假定爲非空,但幾乎每個方法之後都發出警告,說我需要添加可空性註釋。這低於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

我不知道這是否是有意還是無意,但我也觀察到了這一點。只要在接口文件中有* any * nullability註釋,就必須在該文件中的所有位置都定義爲可空*。 –

+0

至少從我對這是如何工作的印象來看,似乎'NS_ASSUME_NONNULL_END'在界面中沒有做任何事情。 Apple Swift博客的示例代碼在'@inter'前面顯示'BEGIN',在'@ 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並不意味着每個參數假定爲nullableunspecified,您仍然必須定義它。所以,你必須指定你想要什麼其他的方法,如果你想要的文字可能是nullable然後將關鍵字添加到該參數是這樣的:

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

而對於'testMethodWithParameter'就是我想要的,但是爲什麼我會在'NS_ASSUME_NONNULL_END'宏後收到關於'methodThatShouldntNeedAnnotationWithText'的警告? – NickCE

+0

我的意思是,你必須在你的參數中指定'nullability',你可以通過使用'MACRO'或通過在每個參數上指定它來實現。 – Fantini

+1

'MACRO'隻影響'..._ BEGIN'和'..._ END'之間的方法簽名,所以這就是編譯器告訴你的方法,'methodThatShouldnt ...'缺少'nullability說明符' – Fantini