【问题标题】:How does swift guard determine true or false when using = operatorswift guard在使用=操作符时如何判断真假
【发布时间】:2017-04-09 13:42:19
【问题描述】:

通过阅读语言指南 (developer.apple.com) 学习 swift 3.1。我了解到,在 swift 中,赋值运算符 (=) 不会返回值。在control flow章节中得到了一个guard语句的例子:

func greet(person: [String: String]) {
    guard let name = person["name"] else {
        return
    }

    print("Hello \(name)!")

    guard let location = person["location"] else {
        print("I hope the weather is nice near you.")
        return
    }

    print("I hope the weather is nice in \(location).")
}

我的问题是如果 '=' 运算符不返回值,那么:

guard let name = person["name"] else {
    return
}  

guard 如何判断 name = person["name"] 是真还是假,并根据此判断 go to else 并返回?

【问题讨论】:

  • 正确,= 不返回任何值。但是person["name"] 返回一个可选值,因此guard let 正在将该值可选绑定到相关变量。所以guard let 语句是说“guard 确保person["name"] 返回一个值,如果是这样,将name 变量设置为该未包装的值”。但是,如果不是(即如果person["name"] 返回nil),那么它将执行else 子句中的内容(例如,在这种情况下为return
  • @Rob,所以对于守卫语句:guard let <condition> 条件 (name = person["name"]) 不必为真或假?
  • @HassanMakarov 这不是guard let <condition>——它是guard <condition><condition> 可以是评估为Bool 的表达式、可用性条件、案例条件,或者在这种情况下是可选绑定条件——通常具有语法let <identifier> = <expression>。这确实意味着它评估为Bool。如果您想要更详细的细分,请参阅the grammar section of the language guide
  • 参见Optional Binding,它展示了它是如何与if 语句一起工作的,这与提前退出guard-else 语句的想法相同。

标签: swift guard-statement


【解决方案1】:

guard 的目的是断言一个值不是 nil,并保证退出当前作用域(如果它是)。这允许在整个函数的其余部分中使用该值,并允许您的“黄金路径”不嵌套在多个 if 语句中。

您可以使用 if-let 语法执行类似的操作,但它不能保证必须退出范围或在其自身范围之外提供受保护的值。

guard let name = person["name"] else {
    return
}
// name available here!

对比

if let name = person["name"] {
    // name available here
} else {
    // name not available here
}

// name not available here either

所有这些都是基于 if/guard 语句是否可以保证一个值的存在,而不是真实性。

【讨论】:

    【解决方案2】:

    正如@Hasmish 指出的,let name = person["name"]optional-binding-condition。当右侧不是 nil 时,它的计算结果为 true,并且具有将包装值绑定到左侧标识符的副作用。

    optional-binding-condition不考虑右手边是否为true/false

    let optionalBool: Bool? = false
    guard let bool = optionalBool else {
        fatalError("This will never be called, because `optionalBool` is not `nil`")
    }
    

    事实上,右手边甚至不必是Bool,正如您所演示的那样。

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2011-04-23
      • 1970-01-01
      相关资源
      最近更新 更多