考虑以下方法
- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
字符串
有了新的nonnull
和nullable
annotation keywords,我们可以如下所示丰富它:
- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
型
但我们也得到了这样的警告:
指针缺少空性类型说明符(__nonnull或__nullable)
它指的是第三个参数(块参数)。
documentation并没有给出如何指定块参数的空性的例子。
只要类型是简单对象或块指针,就可以在左括号后立即使用非下划线形式nullable和nonnull。
我试着把两个关键字中的一个放在块中(在任何位置),但没有任何运气。还尝试了下划线前缀变体(__nonnull
和__nullable
)。
因此,我的问题是:如何为块参数指定空性语义?
6条答案
按热度按时间af7jpaap1#
这似乎起作用了
字符串
您需要为块及其参数指定为空性.
编辑:有关更多信息,请参见Swift Blog
xkrw2x1b2#
根据Apple Blog ("Nullability and Objective-C"),您可以使用
NS_ASSUME_NONNULL_BEGIN
和NS_ASSUME_NONNULL_END
。在这些区域中,任何简单的指针类型都将被假定为
nonnull
。字符串
NSError **
类型,则应为NSError * _Nullable * _Nullable
id *
类型,最好使用id _Nullable * _Nonnull
,这取决于(可能您想要_Nullable id * _Nullable
类型)。NSObject *
类型,则需要在指针之后放置注解,如NSObject * _Nullable * _Nonnull
备注
_Nonnull
和_Nullable
应该在指针或id
之后使用(Apple在示例代码AAPLListItem * _Nullable
中这样做),但非下划线形式nonnull
和nullable
可以在左括号之后使用。然而,在常见的情况下,有一种更好的方式来编写这些注解:在方法声明中,只要类型是简单的对象或块指针,就可以在左括号后面使用无下划线的形式
nullable
和nonnull
。查看更多"Nullability and Objective-C"
为了安全起见,这条规则有几个例外:
typedef
类型通常不具有固有的可空性-根据上下文,它们可以很容易地为空或不可空。因此,即使在审计区域内,typedef
类型也不会被假定为nonnull
。id *
,必须显式注解。例如,要指定指向可空对象引用的不可空指针,请使用_Nullable id * _Nonnull
。NSError **
经常用于通过方法参数返回错误,因此它总是被假定为指向可空NSError
引用的可空指针。_Nullable id * _Nonnull
可能会被混淆,id _Nullable * _Nonnull
更好理解。**
_Nonnull
和_Nullable
应该在指针或id
之后使用(Apple在示例代码AAPLListItem * _Nullable
**中使用)lzfw57am3#
你也可以这样做:
字符串
这只取决于你更喜欢哪种语法。
b09cbbtk4#
为了在头文件中定义补全,我这样做了
字符串
当然,我同意公认的答案。
pes8fvy95#
苹果developer blog:核心:_Nullable和_Nonnull
只要类型是简单对象或块指针,就可以在左括号后立即使用非下划线形式nullable和nonnull。
不带下划线的形式比带下划线的形式更好,但是你仍然需要将它们应用于标题中的每个类型。
brjng4g36#
以下是我在NSError**案例中使用的:
字符串