在Swift中传递条件作为参数?

时间:2019-01-10 16:29:50

标签: swift

我当时正在考虑在我的应用程序中抽象一些条件逻辑。假设在此简化示例中有两个功能:

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], ???)
}

我认为这可以通过闭包或函数来实现。

2 个答案:

答案 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