什么是 SwiftPredicate

您可以使用此库抽象地处理谓词

要求

依赖

用法

简单谓词

import Predicate

struct SimplePredicate<Variable>: PredicateProtocol {
  var _predicate: (Variable) -> Bool
  
  init(_ predicate:@escaping (Variable) -> Bool) {
    self._predicate = predicate
  }
  
  func evaluate(with argument: Variable) -> Bool {
    return self._predicate(argument)
  }
}

let lessThan10 = SimplePredicate<Int>({ $0 < 10 })
let greaterThan0 = SimplePredicate<Int>({ $0 > 0 })

// `PredicateProtocol` provides some operations like below:

print(lessThan10.and(greaterThan0).evaluate(with:5)) // Prints "true" 
print(lessThan10.and(greaterThan0).evaluate(with:-5)) // Prints "false"

print(lessThan10.or(greaterThan0).evaluate(with:15)) // Prints "true" 

print(lessThan10.xor(greaterThan0).evaluate(with:-5)) // Prints "true" 
print(lessThan10.xor(greaterThan0).evaluate(with:5)) // Prints "false"

由谓词定义的集合

还有一个名为 "TotallyOrderedSet" 的集合,它符合 SetAlgebraConsolidatablePredicate(继承自 PredicateProtocol)。您可以使用范围定义集合中包含的元素。(如果您想知道 AnyRange 是什么,请参阅 SwiftRanges。)

import Predicate
import Ranges

let set1 = TotallyOrderedSet<Double>(elementsIn:[
  AnyRange<Double>(..<0.0),
  AnyRange<Double>(1.0...2.0),
  AnyRange<Double>(3.0<..)
])

let set2 = TotallyOrderedSet<Double>(elementsIn:[
  AnyRange<Double>((-2.0)<..(-1.0)),
  AnyRange<Double>(0.5..<1.5),
  AnyRange<Double>(2.0<..<3.5)
])

print(set1.inverted ==
      TotallyOrderedSet<Double>(elementsIn:[
        AnyRange<Double>(0.0..<1.0),
        AnyRange<Double>(2.0<..3.0),
      ])
     )
// Prints "true"

print(set1.intersection(set2) ==
      TotallyOrderedSet<Double>(elementsIn:[
        AnyRange<Double>((-2.0)<..(-1.0)),
        AnyRange<Double>(1.0..<1.5),
        AnyRange<Double>(3.0<..<3.5),
      ])
     )
// Prints "true"

print(set1.union(set2) ==
      TotallyOrderedSet<Double>(elementsIn:[
        AnyRange<Double>(..<0.0),
        AnyRange<Double>(0.5...),
      ])
     )
// Prints "true"

许可

MIT 许可证。
有关更多信息,请参阅 "LICENSE.txt"。