当使用=运算符时,swift guard如何确定正确或错误

当使用=运算符时,swift guard如何确定正确或错误,swift,guard-statement,Swift,Guard Statement,通过阅读语言指南(developer.apple.com)学习swift 3.1。我了解到,在swift中,赋值运算符(=)不返回值。在第章中,我们得到了一个guard声明的示例: func greet(person: [String: String]) { guard let name = person["name"] else { return } print("Hello \(name)!") guard let location = p

通过阅读语言指南(developer.apple.com)学习swift 3.1。我了解到,在swift中,赋值运算符(=)不返回值。在第章中,我们得到了一个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”]是真是假,并根据这一点转到else并返回?

正如@Hasmish指出的那样,
让name=person[“name”]
是一个很好的选择。当右侧不是
nil
时,它的计算结果为true,并具有将包装值绑定到左侧标识符的副作用

可选绑定条件
不考虑右侧是否为
/

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

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

正如@Hasmish所指出的,
让name=person[“name”]
是一个。当右侧不是
nil
时,它的计算结果为true,并具有将包装值绑定到左侧标识符的副作用

可选绑定条件
不考虑右侧是否为
/

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

事实上,正如您所演示的,右侧甚至不必是
Bool

guard的目的是断言一个值是非零的,如果是,则保证退出当前范围。这允许在函数的其余部分使用该值,并允许“黄金路径”不嵌套在几个if语句中

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

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


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

guard的目的是断言值为非零,并保证当前范围的退出(如果是)。这允许在函数的其余部分使用该值,并允许“黄金路径”不嵌套在几个if语句中

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

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


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

正确,
=
不返回任何值。但是
person[“name”]
返回一个可选值,因此
guard let
正在将该值可选绑定到所讨论的变量。因此
guard let
语句会说“
guard
以确保
person[“name”]
返回一个值,如果是,则将
name
变量设置为该未包装的值”。但是,如果没有(即如果
person[“name”]
返回
nil
),那么它将执行
else
子句中的内容(例如,在本例中为
return
)@Rob,因此对于守卫语句:
守卫let
条件(
name=person[“name”
)不一定是真的还是假的?@HassanMakarov它不是
守卫let
——它是
守卫
可以是对
Bool
求值的表达式、可用性条件、案例条件,或者在本例中是可选的绑定条件–通常具有语法
let=
。这并不意味着它的计算结果为
Bool
。查看是否需要更详细的细分。请参阅,其中显示了如何使用
if
语句,以及如何使用早期退出
guard
-
else
语句。正确,
=
不返回任何值。但是
person[“name”]
返回一个可选值,因此
guard let
正在将该值可选绑定到所讨论的变量。因此
guard let
语句会说“
guard
以确保
person[“name”]
返回一个值,如果是,则将
name
变量设置为该未包装的值”。但是,如果没有(即如果
person[“name”]
返回
nil
),那么它将执行
else
子句中的内容(例如,在本例中为
return
)@Rob,因此对于守卫语句:
守卫let
条件(
name=person[“name”
)不一定是真的还是假的?@HassanMakarov它不是
守卫let
——它是
守卫
可以是对
Bool
求值的表达式、可用性条件、案例条件,或者在本例中是可选的绑定条件–通常具有语法
let=
。这并不意味着它的计算结果为
Bool
。查看是否需要更详细的细分。请参阅,其中显示了如何使用
if
语句,以及如何使用早期退出
guard
-
else
语句。