除了Swift互操作之外,_Nullable和_Nonnull是否有用?

时间:2016-05-12 04:57:59

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

如果Objective-C编译器认为您可能将nil传递给标有_Nonnull的参数,那么它是否会实际警告您?

或者它只是提示在Swift和Objective-C之间转换什么工具来更好地处理Swift选项?

1 个答案:

答案 0 :(得分:2)

就其本身而言,只有在非常简单的情况下才会发出警告:当您将nil传递给接受_Nonnull值的函数时。

NSObject* _Nonnull test(NSObject* _Nonnull) {
    test(nil);  // warning

    NSObject* _Nullable f = nil;
    test(f); // no warning (passing _Nullable to _Nonnull), only warn in static analysis

    NSObject* _Nonnull g = [[NSObject alloc] init];
    g = nil; // no warning (!) (assigning nil to _Nonnull)

    if (g != nil) {  // no warning (unnecessary '!= nil' comparison)
        test(g);
    }

    return nil; // no warning (returning nil to _Nonnull)
}

The code above when compiled in Xcode 7

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

As documented,这三个属性不会改变代码的行为:

  

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

除了编译器之外,它还可以帮助静态分析器,但是clang的静态分析器只能抓住那些确定你正在为nil分配_Nonnull的琐碎案例。 }(即上面的test(f)示例)。

尽管如此,将指针_Nonnull / _Nullable标记为

仍然很有用
  1. 文档;
  2. 允许Swift开发人员更好地使用您的库;
  3. 如果您不添加这些注释,编译器会在任何地方发出警告