如何使编译器默认为“可空”

时间:2015-05-18 17:31:26

标签: objective-c swift interop objective-c-nullability

从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。怎么能实现呢?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

我写了一个script that finds all non-annotated headers,它也可以作为构建阶段添加,因此不会忽略任何标题。

答案 2 :(得分:-3)

由于宏被定义为:

#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中产生预期的结果。