苹果似乎声称 那个 Optional
输入Swift比安全更安全 nil
在Objective-C中,但我不明白为什么会这样。
实施中有哪些显着差异 Optional
比...更安全 nil
,这将如何影响我的代码?
苹果似乎声称 那个 Optional
输入Swift比安全更安全 nil
在Objective-C中,但我不明白为什么会这样。
实施中有哪些显着差异 Optional
比...更安全 nil
,这将如何影响我的代码?
我总是检查变量是否是 nil
在我使用它之前避免问题。但是,它仍然偶尔发生一个值可能会出现 nil
令我惊讶的是 - 或者有时我只是忘了检查。
我在Swift中编写越来越多的代码后,我发现使用可选变量确实提供了很多方便,以避免忽略检查 nil
值。我真的不记得任何崩溃所致 nil
变量访问(除非我强制解包某些变量;所以除非你知道你在做什么,否则不要强制解包)。
此外,我曾经在很多地方写过很多像这样的代码:
if (obj != nil) {
obj.property = ...
}
现在我可以简单地做到
obj?.property = ...
代码现在看起来干净利落。你也不喜欢吗?
一般来说,在编程中我们想要避免没有价值的变量(null
要么 nil
)因为使用它们经常导致未定义的行为(异常,错误,崩溃)。
例如,这是一种常见的做法 Array
引用设置为空数组而不是 nil
。在一个空数组我们可以使用所有 Array
方法,例如, indexOf
要么 count
。使用它们 nil
会导致崩溃。
Optionals允许我们指定某些变量永远不会为空,因此我们可以安全地使用它们,编译器会检查它 nil
永远不会分配给他们。此外,编译器强制执行从optionals到非optionals的每次转换都是显式的(我们总是检查 nil
需要的时候)。
所以答案是选项:
从而防止编程错误。
另请注意,您应尽可能避免使用选项。期权的最大力量是大多数变量不是期权。
它变得“安全”,因为它迫使程序员编写更明确的代码。
if let ...
和 guard
语法明确地说“只有在存在这些变量的值时才执行此操作”。!
如果变量是,语法会使程序崩溃 nil
当程序员没想到的时候 nil
。相比之下,Objective-C的调用方式 nil
无操作 可能 让程序继续执行直到这样的程度 nil
是不能接受的。一个常见的例子是 nil
NSString
变量。许多API调用很满意 nil
NSString
除了建造时 NSAttributedString
(它不会接受 nil
NSString
参数和崩溃你的应用程序)。因此,当你得到一个 NSString
变量意外变成了 nil
,可能会等一段时间,直到你的应用程序崩溃,因为它试图用它构建一个属性字符串 nil
值。
有关Optionals试图解决的问题的更完整说明,请考虑 此帖由Daniel Jalkut于2010年回归。这是在Swift之前写的。
在Objective-C中,您可以定义没有值的变量。如果要在分配值之前使用该变量,则会得到未定义的行为(这非常糟糕)。相反,swift可以防止对象值未知的情况。