您可以使用此库抽象地处理谓词。
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" 的集合,它符合 SetAlgebra
和 ConsolidatablePredicate
(继承自 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"。