当使用=运算符时,swift guard如何确定正确或错误
通过阅读语言指南(developer.apple.com)学习swift 3.1。我了解到,在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
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
语句。