我已经读过这篇文章,但需要一些额外的帮助。
我想构造一个闭包,它接受可变数量的双精度,将它们与阈值(也是双精度(进行比较,并返回一个布尔值,检查是否所有条目都大于阈值。返回类型应(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)
}
}
但是,编译器抱怨
无法将类型"(_( -> _"的返回表达式转换为返回类型"(双精度...(-> Bool">
为什么会发生这种情况,我该如何解决这个问题?谢谢!
尝试在闭包中指定参数类型和返回类型,以帮助编译器了解它应该取什么值并返回什么值。此外,您在循环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