有条件的预期表达

时间:2019-02-22 21:48:00

标签: swift guard-statement

我编写了以下函数,并且在guard语句中遇到以下错误。

  

条件表达式中的期望表达式

func containsNearbyDuplicate(_ nums: [Int], _ k: Int) -> Bool {

    // form a dictionary key is the number, value is the index
    var numDict = [Int : Int]()
    for (i,num) in nums.enumerated()
    {
        guard let index = numDict[num] , where i - index <= k else
        {
            numDict [num] = i
            continue
        }
        return true
    }

    return false

}

1 个答案:

答案 0 :(得分:2)

where关键字将另一个表达式添加到实际guard语句的第一个表达式中。取而代之的是,您可以用逗号将两个表达式分开,并删除where关键字。

那是为什么?

在Swift中,您可以在一个ifguard语句中枚举多个用逗号分隔的表达式,如下所示:

if a == b, c == d {}
guard a == b, c == d else {}

这类似于&&运算符。区别在于逗号版本允许解包可选对象,如下所示:

if let nonOptional = optional, let anotherNonOptional = anotherOptional {}
guard let nonOptional = optional, let anotherNonOptional = anotherOptional else {}

为什么Internet会显示将ifguardwhere一起使用的代码示例?

这是因为在较早的Swift版本中,可以将whereifguard一起使用。但这后来被删除了,因为where的目的是向非表达式语句中添加一个表达式,例如for-in或作为classstruct定义的约束。