El Sushiboi
El Sushiboi

Reputation: 454

Swift Variadic Closures Syntax?

I've read this post, but need a little additional help.

I would like to construct a Closure which takes in a variable amount of Doubles, compares them to a threshold (which is also a Double) and returns a Bool checking if ALL entries were greater than the threshold. The return type should be (Double...) -> Bool

Here is what I have so far:

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

However, the compiler complains that

Cannot convert return expression of type '(_) -> _' to return type '(Double...) -> Bool'

Why is this happening and how can I fix this? Thanks!

Upvotes: 2

Views: 206

Answers (1)

pacification
pacification

Reputation: 6018

Try to specify parameter type and return type in closure to helps compiler to understand what value it should take and return. Also, you have a mistake in for loop. The interval should be like this 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

Also, you can write it almost in 1 line of code:

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

Upvotes: 1

Related Questions