如何让编译器默认假定为 `nullable`
How to Make Compiler Assume `nullable` by Default
从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
指定。如何实现?
由于宏定义为:
#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
。
如果存在从 nullable
到 non-nullable
的隐式转换,这将发出警告。
似乎没有办法通过添加可空性注释来摆脱隐式解包的可选值。
我写了一个 script that finds all non-annotated headers 也可以作为构建阶段添加,所以没有 headers 被忽略。
从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
指定。如何实现?
由于宏定义为:
#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
。
如果存在从 nullable
到 non-nullable
的隐式转换,这将发出警告。
似乎没有办法通过添加可空性注释来摆脱隐式解包的可选值。
我写了一个 script that finds all non-annotated headers 也可以作为构建阶段添加,所以没有 headers 被忽略。