来自python并使用空字符串作为if语句的条件测试Swift。
错误消息是什么意思?
if Bool("") {}
给出了三个编译器消息
error: value of optional type 'Bool?' must be unwrapped to a value of type 'Bool'
note: coalesce using '??' to provide a default when the optional value contains 'nil'
note: force-unwrap using '!' to abort execution if the optional value contains 'nil'
此行为的用途是什么?
Bool("")
返回nil
这样设计的目的是什么?
答案 0 :(得分:2)
实际上不是3条错误消息。这是1条错误消息,外加2条建议的解决方法。
if
语句中的条件应为Bool
,但是您在此处使用的表达式Bool("")
的类型为Bool?
。编译器发现这只是一个Bool
包裹在一个可选变量中,因此它提出了一些方法来解开该可选变量,从而获得if
语句所期望的类型-Bool
。 / p>
第一种建议的方法是使用Bool("")
运算符] 1为nil
为??
时提供默认值,如下所示:
if Bool("") ?? true {}
第二种方法是强制将其拆开,如果Bool("")
为nil
,则实际上会使程序崩溃:
if Bool("")! {}
尽管在这种情况下,这两种固定方法都非常愚蠢,因为Bool("")
始终为nil。但是关键是,当您需要拆开可选选项时,这是编译器建议的两种方式。
继续讲第二个问题,为什么Bool.init
返回一个可选内容?
初始化器可能会返回nil
,因为它们可能会失败,这些初始化器称为failable initialisers。用Bool
初始化String
可能会失败,因为只有字符串“ true”和“ false”才能成功创建Bool
。所有其他字符串都不代表Bool
值。