是什么让Swift的“可选”比Objective-C的“nil”更安全?

时间:2016-02-22 05:14:30

标签: objective-c swift pointers optional

Apple seems to claim Swift中的Optional类型比Objective-C中的nil更安全,但我不明白为什么会这样。

使Optionalnil更安全的实施中有哪些显着差异,以及这将如何影响我的代码?

4 个答案:

答案 0 :(得分:3)

我总是在使用它之前检查变量是否为nil以避免出现问题。但是,它仍然会偶尔出现一个值可能会以nil的形式出现,令我惊讶的是 - 或者有时我只是忘记检查。

在Swift中编写越来越多的代码之后,我发现使用可选变量确实提供了很多方便,可以避免忽略对nil值的检查。我不记得由于nil变量访问导致的任何崩溃(除非我强制解开一些变量;所以除非你知道你在做什么,否则不要强行解包)。

此外,我曾经在很多地方写过很多像这样的代码:

if (obj != nil) {
    obj.property = ...
}

现在我可以简单地将其作为

 obj?.property = ...

现在代码看起来干净利落。你也不喜欢它吗?

答案 1 :(得分:2)

它变得“安全”,因为它迫使程序员编写更明确的代码。

  • if let ...guard语法明确说明“只有在存在这些变量的值时才执行此操作”。
  • !语法会导致程序崩溃,如果变量为nil,程序员不希望它是nil

相反,Objective-C调用nil no-op 的方式可能让程序继续执行,直到nil不可接受为止。一个常见示例是nil NSString个变量。许多API调用都对nil NSString感到满意,除非在构建NSAttributedString时(它不会接受nil NSString参数并导致您的应用崩溃)。因此,当您NSString变量意外变为nil时,可能会稍晚,直到您的应用崩溃,因为它尝试构建具有nil值的属性字符串。

有关Optionals试图解决的问题的更完整说明,请考虑this post back from 2010 by Daniel Jalkut。这是在斯威夫特之前写的。

答案 2 :(得分:2)

通常,在编程中我们希望避免没有值(nullnil)的变量,因为使用它们通常会导致未定义的行为(异常,错误,崩溃)。

例如,将Array引用设置为空数组而不是nil是一种常见做法。在空数组上,我们可以使用所有Array方法,例如indexOfcount。在nil上使用它们会导致崩溃。

Optionals允许我们指定某些变量永远不会为空,因此我们可以安全地使用它们,并且编译器会检查nil从未分配给它们。此外,编译器强制执行从optionals到非optionals的每次转换都是显式的(我们总是在需要时检查nil)。

所以答案就是选项:

  1. 实施良好的编程实践。
  2. 允许在编译时更好地检查代码
  3. 从而防止编程错误。

    另请注意,您应该尽可能避免使用选项。期权的最大优势在于大多数变量都不是期权。

答案 3 :(得分:-2)

在Objective-C中,您可以定义没有值的变量。如果要在分配值之前使用该变量,则会得到未定义的行为(这非常糟糕)。相反,swift会阻止对象值未知的情况。