Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 斯威夫特:守卫和地点-优先权_Swift - Fatal编程技术网

Swift 斯威夫特:守卫和地点-优先权

Swift 斯威夫特:守卫和地点-优先权,swift,Swift,有时,我想结合使用guard和let&where来简化我的代码。但我想知道出租的优先顺序是什么,在哪里。例如: class Person { func check() -> Bool? { print("checking") return nil } } func test(dont: Bool) { let person = Person() guard let check = person.check() where d

有时,我想结合使用guard和let&where来简化我的代码。但我想知道出租的优先顺序是什么,在哪里。例如:

class Person {
    func check() -> Bool? {
        print("checking")
        return nil
    }
}

func test(dont: Bool) {
    let person = Person()
    guard let check = person.check() where dont else {
        print("should not check")
        return
    }
    print("result: \(check)")
}


test(false)
正如您可以看到的控制台结果,打印输出为:

检查 不应该检查 对于guard else{}语法中let check=person.check where dont的条件,即使where中的表达式与let中表达式的结果不相关,Swift似乎也会先执行let,然后再执行check where。有时在我的代码中,let可选绑定需要大量计算,where只是一个简单的条件,不依赖let结果,我是否应该将where移出防范?或者我对优先级或let&where的理解有误?

在您的Swift 2代码中,您是对的

条件绑定let check=。。。首先选中,并且仅当该操作成功时,才会选中布尔条件dont。你可以用

guard dont, let check = person.check() else { }
首先检查布尔条件

Swift 3中已消除了这种语法不对称: 所有保护条款用逗号和 where关键字不再使用。你有吗

guard let check = person.check(), dont else { }
// or
guard dont, let check = person.check() else { }
通过短路从左到右检查条件, i、 e.如果一个条件失败,则执行else块而不执行 检查其余条件

guard let check = person.check(), dont else { }
// or
guard dont, let check = person.check() else { }