Swift编译器对Bool(“”)的意思是什么奇怪的消息?

时间:2019-05-10 13:30:05

标签: swift compiler-errors initialization

来自python并使用空字符串作为if语句的条件测试Swift。

  1. 错误消息是什么意思?
    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'
  2. 此行为的用途是什么?
    Bool("")返回nil
    这样设计的目的是什么?

1 个答案:

答案 0 :(得分:2)

实际上不是3条错误消息。这是1条错误消息,外加2条建议的解决方法。

if语句中的条件应为Bool,但是您在此处使用的表达式Bool("")的类型为Bool?。编译器发现这只是一个Bool包裹在一个可选变量中,因此它提出了一些方法来解开该可选变量,从而获得if语句所期望的类型-Bool。 / p>

第一种建议的方法是使用Bool("")运算符] 1nil??时提供默认值,如下所示:

if Bool("") ?? true {}

第二种方法是强制将其拆开,如果Bool("")nil,则实际上会使程序崩溃:

if Bool("")! {}

尽管在这种情况下,这两种固定方法都非常愚蠢,因为Bool("")始终为nil。但是关键是,当您需要拆开可选选项时,这是编译器建议的两种方式。

继续讲第二个问题,为什么Bool.init返回一个可选内容?

初始化器可能会返回nil,因为它们可能会失败,这些初始化器称为failable initialisers。用Bool初始化String可能会失败,因为只有字符串“ true”和“ false”才能成功创建Bool。所有其他字符串都不代表Bool值。