我当时正在考虑在我的应用程序中抽象一些条件逻辑。假设在此简化示例中有两个功能:
func1(val1: Int, val2: Int, threshold: Int) -> Bool {
return (val1 == threshold && val2 == threshold)
}
func2(val: Int, thresholdHi: Int, thresholdLo: Int) {
return (val < thresholdHi && val > thresholdLo)
}
我的想法是使一个函数对一组值执行条件检查。
funcIdea(vals[Int], conditional: ???) -> Bool {
for val in vals {
if !conditional(val) { return false; }
}
return true
}
func1(...){
return funcIdea([val1, val2], ???)
}
我认为这可以通过闭包或函数来实现。
答案 0 :(得分:0)
有可能关闭。
func funcIdea(vals: [Int], conditional: (Int)->Bool) -> Bool {
for val in vals {
if !conditional(val) { return false; }
}
return true
}
func func1(val1: Int, val2: Int, threshold: Int) -> Bool {
//return (val1 == threshold && val2 == threshold)
return funcIdea(vals: [val1, val2], conditional: { (val) -> Bool in
return val > threshold
})
}
答案 1 :(得分:0)
您需要将闭包传递给函数,然后可以使用contains(where:)
检查数组的所有元素的闭包是否为true。为了使contains(where:)
提前退出,必须进行两次否定。
extension Array {
func allElementsSatisfy(_ condition: (Element)->(Bool)) -> Bool {
return !self.contains(where: { !condition($0)})
}
}
然后您可以像这样在任何数组上简单地调用它:
[1,2,3].allElementsSatisfy({$0 < 1}) // false
[1,2,3].allElementsSatisfy({$0 < 4}) // true
["a","b","c"].allElementsSatisfy({$0.count == 1}) // true
["a","b","c"].allElementsSatisfy({$0.count > 1}) // false