Apple seems to claim Swift中的Optional
类型比Objective-C中的nil
更安全,但我不明白为什么会这样。
使Optional
比nil
更安全的实施中有哪些显着差异,以及这将如何影响我的代码?
答案 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)
通常,在编程中我们希望避免没有值(null
或nil
)的变量,因为使用它们通常会导致未定义的行为(异常,错误,崩溃)。
例如,将Array
引用设置为空数组而不是nil
是一种常见做法。在空数组上,我们可以使用所有Array
方法,例如indexOf
或count
。在nil
上使用它们会导致崩溃。
Optionals允许我们指定某些变量永远不会为空,因此我们可以安全地使用它们,并且编译器会检查nil
从未分配给它们。此外,编译器强制执行从optionals到非optionals的每次转换都是显式的(我们总是在需要时检查nil
)。
所以答案就是选项:
从而防止编程错误。
另请注意,您应该尽可能避免使用选项。期权的最大优势在于大多数变量都不是期权。
答案 3 :(得分:-2)
在Objective-C中,您可以定义没有值的变量。如果要在分配值之前使用该变量,则会得到未定义的行为(这非常糟糕)。相反,swift会阻止对象值未知的情况。