19

从 Xcode 6.3 开始,Objective-C 中的类型可以用nullable或标记nonnull这是 Apple 的博客文章

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

由于这极容易失败,我希望编译器默认将 Objective-C 中的所有内容假定为nullable,除非另有指定 vianonnull或审核的区域宏NS_ASSUME_NONNULL_BEGIN / END。怎样才能做到这一点?

4

3 回答 3

0

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

于 2016-10-28T00:22:22.023 回答
0

似乎没有办法添加可空性注释以摆脱隐式展开的选项。

我编写了一个脚本来查找所有未注释的标头,这些标头也可以作为构建阶段添加,因此不会忽略任何标头。

于 2016-12-17T22:42:17.667 回答
-2

由于宏定义为:

#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")

我只做了一个快速测试来检查这个编译指示是否编译失败,它没有。但我还没有测试这是否会在 Swift 中产生预期的结果。

于 2015-08-14T17:53:06.653 回答