Синтаксис Swift Variadic Closures? - PullRequest
       101

Синтаксис Swift Variadic Closures?

1 голос
/ 17 октября 2019

Я прочитал этот пост , но мне нужна небольшая дополнительная помощь.

Я хотел бы создать Замыкание, которое принимает переменное количество значений Double, сравнивает их с порогом(который также является Double) и возвращает Bool, проверяющий, были ли ВСЕ записи больше порога. Тип возвращаемого значения должен быть (Double...) -> Bool

Вот что у меня есть:

func isAllAbove(lower: Double) -> (Double...) -> Bool {
    return {
        var conditions: [Bool] = []
        for i in 0...$0.count {
            conditions.append(lower < $0[i])
        }
        return !conditions.contains(false)
    }
}

Однако компилятор жалуется, что

Невозможно преобразовать выражение возврататипа '(_) -> _' для возврата типа '(Double ...) -> Bool'

Почему это происходит и как я могу это исправить? Спасибо!

1 Ответ

1 голос
/ 17 октября 2019

Попробуйте указать тип параметра и тип возвращаемого значения в закрытии, чтобы помочь компилятору понять, какое значение он должен принимать и возвращать. Также у вас есть ошибка в цикле for. Интервал должен быть таким: 0 ..< values.count:

func isAllAbove(lower: Double) -> (Double...) -> Bool {
    return { (values: Double...) -> Bool in
        var conditions: [Bool] = []
        for i in 0 ..< values.count {
            conditions.append(lower < values[i])
        }
        return !conditions.contains(false)
    }
}

let allAbove = isAllAbove(lower: 2)
print(allAbove(1, 2, 3)) // false

Кроме того, вы можете записать его почти в 1 строку кода:

let lower = 2
let isAllAbove = ![1, 2, 3].contains { $0 < lower }
print(isAllAbove1) // false
...