Ожидаемое выражение в условном выражении

Я написал следующую функцию и получаю следующую ошибку в заявлении охранника.

ожидаемое выражение в условном выражении

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 ответ

Решение

where Ключевое слово добавляет другое выражение к первому выражению фактического guard заявление. Вместо этого вы можете разделить оба выражения запятой и удалить where ключевое слово.

Это почему?

В Swift вы можете перечислить несколько выражений, разделенных запятыми в одном if или же guard утверждение так:

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 {}

Почему Интернет показывает примеры кода, где if а также guard используются вместе с where ?

Это потому, что в старых версиях Swift можно было использовать where вместе с if а также guard, Но тогда это было удалено, потому что where должен был добавить выражение к выражению без выражения, например for-in или как ограничение для class а также struct определения.

Другие вопросы по тегам