_Nullable 和 _Nonnull 对 Swift 互操作以外的任何东西都有用吗?

ios*_*ude 5 objective-c swift objective-c-nullability

如果 Objective-C 编译器认为您可能要传递nil给标有 的参数,它实际上会警告您_Nonnull吗?

或者它只是暗示任何工具在 Swift 和 Objective-C 之间转换以更好地处理 Swift 选项?

ken*_*ytm 3

就其本身而言,仅在极其微不足道的情况下才会出现警告:当您传递nil给接受值的函数时_Nonnull

\n\n
NSObject* _Nonnull test(NSObject* _Nonnull) {\n    test(nil);  // warning\n\n    NSObject* _Nullable f = nil;\n    test(f); // no warning (passing _Nullable to _Nonnull), only warn in static analysis\n\n    NSObject* _Nonnull g = [[NSObject alloc] init];\n    g = nil; // no warning (!) (assigning nil to _Nonnull)\n\n    if (g != nil) {  // no warning (unnecessary \'!= nil\' comparison)\n        test(g);\n    }\n\n    return nil; // no warning (returning nil to _Nonnull)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的代码在 Xcode 7 中编译时

\n\n

(有一个-Wnullable-to-nonnull-conversion标志,但它似乎对上面的代码没有任何影响。)

\n\n

如文档所述,这三个属性不会改变代码的行为:

\n\n
\n

\xe2\x80\xa6 请注意,与声明属性不同nonnull, 的存在_Nonnull 并不意味着传递 null 是未定义行为fetch可以自由地考虑 null 未定义行为或(可能出于向后兼容性的原因)防御性地处理 null

\n
\n\n

除了编译器之外,它还会帮助静态分析器,但是 clang 的静态分析器只会捕获它确定将 a 分配nil给 a 的微不足道的情况_Nonnull(即test(f)上面的示例)。

\n\n

_Nonnull尽管如此,将指针/_Nullable标记为仍然有用

\n\n
    \n
  1. 文档;
  2. \n
  3. 让 Swift 开发者更好地使用你的库;
  4. \n
  5. 如果您不添加这些注释,编译器将在各处发出警告
  6. \n
\n