如何让编译器默认假定为 `nullable`

How to Make Compiler Assume `nullable` by Default

从Xcode 6.3开始,Objective-C中的类型可以用nullablenonnullhere is Apple's blog post about this

标记

问题是,当两者均未指定时,编译器会将 Objective-C 代码作为 隐式解包 导入 Swift,例如NSView!。所以当一个对象实际上 nil 时,那么当从 Swift 访问它时它会崩溃。这 不会 产生编译器错误。

由于这极易失败,我希望编译器默认将 Objective-C 中的所有内容假定为 nullable,除非另有说明通过 nonnull 或审核区域宏 NS_ASSUME_NONNULL_BEGIN / END 指定。如何实现?

由于宏定义为:

#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#define NS_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")

可能值得尝试看看是否有相应的 assume_nullable 宏。

#define XX_ASSUME_NULLABLE_BEGIN _Pragma("clang assume_nullable begin")
#define XX_ASSUME_NULLABLE_END   _Pragma("clang assume_nullable end")

我只是做了一个快速测试来检查这个 pragma 是否编译失败,它没有。但是我还没有测试这是否会在 Swift.

中产生预期的结果

不完全是您要查找的内容,但从 Xcode 7 开始,您可以通过在编译器标志中传递 -Wnullable-to-nonnull-conversion 标志来在 LLVM 编译器设置中打开 CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION。 如果存在从 nullablenon-nullable 的隐式转换,这将发出警告。

似乎没有办法通过添加可空性注释来摆脱隐式解包的可选值。

我写了一个 script that finds all non-annotated headers 也可以作为构建阶段添加,所以没有 headers 被忽略。