swift - Swift编译器对Bool (“”)意味着什么奇怪的消息?

标签 swift compiler-errors initialization

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

  • 错误消息是什么意思?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这样设计的目的是什么?
  • 最佳答案

    这实际上不是3条错误消息。这是1条错误消息,外加2条建议的解决方法。
    if语句中的条件应该是Bool,但是您在此处使用的表达式Bool("")的类型为Bool?。编译器看到这只是包裹在可选变量中的Bool,因此它建议了解开可选变量的方法,以便获得if语句期望的类型-Bool

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

    if Bool("") ?? true {}
    

    第二种方法是强制打开它,如果Bool("")nil,则实质上使程序崩溃:
    if Bool("")! {}
    

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

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

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

    关于swift - Swift编译器对Bool (“”)意味着什么奇怪的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56078751/

    相关文章:

    c++ - 关于类类型静态数组的空初始化

    应用程序委托(delegate)中的 iOS 弹出消息?

    C:\Program Files(x86)\Windows Kits\8.1\Include\um\dbghelp.h(1545):错误C2220:警告被视为错误 - 未生成 'object'文件

    c++ - 在 C++ 中用于初始化二维数组的 C 嵌套数组指示符的最佳替代方法是什么?

    c++ - 运算符重载new和delete得到编译器错误

    c - 带有 srand 的函数将无法编译

    c++ - 作为函数参数传递的 vector 初始值设定项列表

    ios - ScrollView 平移手势与 panGestureRecognizer 之间的冲突

    swift - 大中央调度

    json - 使用 Swift JSONDecoder 处理 JSON