【问题标题】:What is nonnull in objective C?什么是目标 C 中的非空值?
【发布时间】:2015-06-23 11:51:25
【问题描述】:

谁能详细说明为什么在 iOS 9 中引入了nonnull

例如,NSArray 方法 + (instancetype)array; 现在是 + (instancetype nonnull)array;

参考: https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html

这是一个 Objective-c 级别的功能,这将如何影响现有的应用程序?

【问题讨论】:

    标签: ios objective-c initialization xcode7 ios9


    【解决方案1】:

    他们已确保无论该类型不是可空的,它现在都是nonnull 类型。

    像之前的NSMutableArray addObject方法是

    - (void)addObject:(ObjectType)anObject  
    

    现在改成了

    - (void)addObject:(ObjectType nonnull)anObject
    

    因此,这意味着您不能将空对象 (nil) 传递给此方法。同样的方式,在你的情况下

    + (instancetype nonnull) array
    

    方法永远不会返回nil

    参考:https://developer.apple.com/swift/blog/?id=25

    【讨论】:

      【解决方案2】:

      nonnull 是一个关键字,告诉编译器返回值(或参数或属性)永远不会为零。这是在以前版本的 Xcode 中引入的,以实现 Obj-C 和 Swift 的可选类型之间更好的互操作性。

      您可以在the official Swift blog了解更多信息

      【讨论】:

      • 您的意思是“永远不会有意为零”。
      • 它可能为零,但无论如何你的应用程序都在 DS 中,而且超出了希望。我想知道是否有人尝试过当您 do 将 nil 分配给 Swift 对象引用时会发生什么。
      • @gnasher729 - 根据我在这里看到的问题,人们经常尝试这样做。
      【解决方案3】:

      nonnull 是关键字,它通知编译器对象/参数返回的值永远不会是nil

      一般来说,你应该大致看待 nullable 和 nonnull 您当前使用断言或异常:违反合同是 程序员错误。特别是,返回值是你 控制,所以你永远不应该为不可为空的返回类型返回 nil 除非是为了向后兼容。

      【讨论】:

        【解决方案4】:

        引入了 nullable 和 nonnull 以使 Objective C 和 Swift 的互操作性更容易。

        Objective C 在可选引用和非可选引用之间没有任何区别。然后 Swift 编译器无法确定对 Objective C 代码的特定引用是否是可选的。

        nullable 注解与 Swift 中的 optional 相同。 nonnull 注解与 Swift 中的 non-optional 相同。

        经验法则是任何简单的指针类型都将被假定为非空(更多详细信息请阅读the official Swift blog

        我还要说,从 Objective C 的角度来看,这个新注释也将提高代码质量。我通常想知道如果将 nil 作为参数传递,应用程序会崩溃吗?例如:

        id var;
        NSMutableArray *a = [NSMutableArray new];
        [a addObject:var];
        

        在这种情况下,编译器什么也没说,您的应用程序将在执行时崩溃!现在有了这个新注释,您将在编译时看到警告。我知道这个例子很愚蠢,但是在某些情况下,除非您阅读文档,否则您不知道是否需要在调用方法之前检查属性是否为 nil。

        【讨论】:

        • 在您的示例中,我认为重要的是要注意应用程序仅由于 NSMutableArray 引发的异常而崩溃。 object 参数被注释为 nonnull 的事实不会使应用程序崩溃并出现异常(不幸的是)。我倾向于在我的公共方法中验证我的输入是否为 nil,并抛出我自己的描述性异常,而不是稍后因为更难诊断的原因而崩溃。
        猜你喜欢
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多