我在Swift网站和这里的各种帖子上看到了这段代码,我正在努力掌握基本知识。这行代码是如何求值的?
if let name = optionalName {
我很困惑,因为它不是name ==可选的name,它是赋值的,那么这怎么会报告为真,为什么当你用nil替换john appleseed时它不为真,因为它仍然是相等的?
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
6条答案
按热度按时间nmpmafwu1#
实际上,这一行是在说,“如果你能让新变量
name
等于optionalName
的非可选版本,那么就用它做下面的事情”,正如Martin所指出的,这叫做可选绑定。它的唯一目的是测试可选变量是否包含实际值,并将非可选形式绑定到临时变量。这是“展开”可选变量或换句话说,访问可选变量中包含的值的安全方法。它绝不是测试任何类型的相等性。它只是测试可选变量中是否存在值。
tcomlyy62#
一个可选项要么设置要么不设置(不是nil或nil)......留给我们一个重要的决定。“我们应该如何编写代码,使它能够正确地工作2两种状态?"。我们 * 展开 * 可选项的方式是什么决定我们。
有几种方法可以用来对抗未设置的可选项。
以下是4种方法
使用forced unwrapping将崩溃如果你没有一个值。你会希望这样做,如果有一个值是至关重要的,如 * 标题的电影 *(每部电影必须有一个名称)。
!
是用于强制展开。使用nil合并是另一种方式,它将给予你更多的控制,这意味着它不会崩溃,如果值没有设置,也不会“不设置它什么都没有”,如果它没有设置...它会做你告诉它做什么,例如,它会默认/设置 * 电影的名称为untitled_movie*,如果没有名称设置。
??
用于nil合并。使用optional Chaining不会做任何事情如果你没有一个值,并将设置值如果你有一个值。你这样做的东西,有它的值设置是 * 不 * 至关重要的,例如 * 你的演员的代理人的名字 *。
?
是用于可选的链接。使用
if-let
(或guard
,这是两种不同类型的optional binding)将给予你更多的控制,如果没有设置值,它不会崩溃。如果设置了值,那么你可以做一些事情。如果没有设置,那么你可以添加一个else
语句。这是最常用的展开方式,因为不鼓励强制展开。有关不鼓励强制展开的原因的详细讨论,请参阅here。有关
guard
和if-let
之间的良好比较,请参阅guard vs. if-let
附注:
可选绑定和可选链接通常一起使用:
imzjd6km3#
if语法接受两个不同的条件。第二个条件是可选的绑定,它不是布尔值。这很容易让人混淆,你可以这样写:
但不是
苹果documentation(Swift参考):
Bool
类型或桥接到Bool
的类型。条件也可以是可选绑定声明,如可选绑定中所述。wvmv3b1j4#
if
只接受布尔表达式,除此之外,它会抛出一个错误,所以这个代码片段说如果optionalName为nil,则条件为false,else语句将执行。但是,如果optionalName有一些值,则可选值被展开/赋值到常量变量ie name中。
tpgth1q75#
无论何时使用 * 弱引用、可选类型 *,最好使用 if let 来保护代码并避免崩溃
lymnna716#
ABAP对此有更好的实现。如果optionalName不是首字母。//打印包含姓名问候语