1

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

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
}  

守卫如何确定name = person["name"]是真还是假,并取决于它去 else 并返回?

4

2 回答 2

5

守卫的目的是断言一个值是非零的,如果是,则保证当前范围的退出。这允许在整个函数的其余部分中使用该值,并允许您的“黄金路径”不嵌套在多个 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 语句是否可以保证一个值的存在,而不是真实性。

于 2017-04-09T17:39:58.770 回答
1

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

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实际上,正如您所演示的,右手边甚至不必是 a 。

于 2017-04-09T15:30:33.800 回答