从Xcode 6.3开始,Objective-C中的类型可以标记为nullable
或nonnull
,here is Apple's blog post about this。
问题是,当两者都没有指定时,编译器将Objective-C代码作为隐式解包导入到Swift中,例如, NSView!
。因此,当一个对象 为nil时,从Swift访问它时会崩溃。这样做不会产生编译错误。
由于这非常容易失败,我希望编译器默认将Objective-C中的所有内容假设为nullable
,除非通过nonnull
另行指定,或审计区域宏NS_ASSUME_NONNULL_BEGIN / END
。怎么能实现呢?
答案 0 :(得分:0)
不完全是您要查找的内容,但是从Xcode 7开始,您可以通过在编译器标志中传递CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION
标志来打开LLVM编译器设置中的-Wnullable-to-nonnull-conversion
。
如果存在从nullable
到non-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中产生预期的结果。