实际上,我已经把这个话题搞砸了一点。我想在一个有点大的项目中改善可空性情况(让它更“迅速”)。这是我发现的。
首先,您应该打开CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION
( -Wnullable-to-nonnull-conversion
)
其次,关于
首先使用本地对象,该对象的属性未指定可为空,因此它可以用作期望非空的方法的合法参数。
这闻起来很糟糕,我创建了一个名为NONNUL_CAST()
. 以下是如何实现它的示例:
#define NONNUL_CAST(__var) ({ NSCAssert(__var, @"Variable is nil");\
(__typeof(*(__var))* _Nonnull)__var; })
在这里你可以看到 hacky __typeof(*(__var))* _Nonnull)__var
,但还不错。如果__var
是A* _Nullable
我们取消引用__var
的类型,那么它现在只是类型A
,在我们再次引用之后,但是_Nonnull
,并得到非空__var
作为答案。当然,我们断言,以防万一出现问题。
第三,您必须在每个局部变量上指定可空性,并且应该将所有代码放入 中NS_ASSUME_NONNULL_BEGIN/END
,如下所示:
NS_ASSUME_NONNULL_BEGIN
<your_code_goes_here>
NS_ASSUME_NONNULL_END`
您将代码的每一行(导入除外)放在.h
和.m
文件中。这将假定您的方法、返回类型和属性的所有参数都是非空的。如果你想让它可以为空,把它放在那里。
那么,一切都完成了,现在呢?以下是典型用法示例:
- (Atype*)makeAtypeWithBtype:(nullable BType*)btype {
Atype* _Nullable a = [btype makeAtype];
if (a) {
// All good here.
return NONNUL_CAST(a);
} else {
// a appeared as nil. Some fallback is needed.
[self reportError];
return [AtypeFactory makeDeafult];
}
}
现在您有了更强大的可空性情况。可能看起来不太好看,但它是客观的,所以没什么可抱怨的。