Formulitic
Formulitic是用Swift编写的公式计算库。
用法
基本用法
公式是一个描述计算的字符串,类似于电子表格应用程序中的公式。
let formulaString = "1 + 2 * 3"
您可以通过Formulitic
对象解析和计算它。
let formulitic = Formulitic()
let formula = formulitic.parse(formulaString)
let result = formula.evaluate()
计算结果具有以下类型之一:数字、字符串、布尔值或错误。
switch result {
case let numerableResult as NumerableValue:
print(numerableResult.number) // prints "7.0" in this example
case let stringableResult as StringableValue:
print(stringableResult.string)
case let booleanableResult as BooleanableValue:
print(booleanableResult.bool)
case let errorableResult as ErrorableValue:
print(errorableResult)
default:
break
}
引用
公式可以包含花括号中的引用。
let formulaString = "2 * {pi} * {radius}"
为了解决这些引用,使用了一个称为"引用生成器"的对象。它遵循ReferenceProducer
协议,并为每个引用名称生成一个ReferableValue
。
对于简单情况,您可以使用BasicReferenceProducer
类。
let refProducer = BasicReferenceProducer()
refProducer.dereferencer = { (name, _) -> Value in
switch name {
case "pi":
return DoubleValue(number: Double.pi)
case "radius":
return DoubleValue(number: 5)
default:
return ErrorValue.invalidReference
}
}
然后使用这个引用生成器创建一个Formulitic
对象。
let formulitic = Formulitic(referenceProducer: refProducer)
let formula = formulitic.parse(formulaString)
let result = formula.evaluate()
// the result is a NumerableValue whose number is 31.41592...
函数
公式可以包含函数调用。
let formulaString = "HELLO(\"world\")"
在评估函数时,实际实现由一个名为 "函数提供者" 的对象提供,该对象符合 FunctionProvider
协议。
您可以使用 BasicFunctionProvider
类。
let funcProvider = BasicFunctionProvider()
funcProvider.installFunctions([
"HELLO": { (parameters, context) in
guard parameters.count == 1 else { return ErrorValue.invalidArgumentCount }
let param = parameters[0]
.evaluate(with: context)
.dereference(with: context)
.cast(to: .stringable, context: context)
if param is ErrorableValue {
return param
}
guard let textParam = param as? StringableValue else { return ErrorValue.generic }
let text = textParam.string
return StringValue(string: "Hello, \(text)")
}
])
然后用此函数提供者创建 Formulitic
对象。
let formulitic = Formulitic(functionProvider: funcProvider)
let formula = formulitic.parse(formulaString)
let result = formula.evaluate()
// the result is a StringValue whose string is "Hello, world".
此外,还有一些内置函数,默认未安装。您可以根据需要将它们安装到 BasicFunctionProvider
中。
let formulaString = "LEN(\"foobar\")"
let funcProvider = BasicFunctionProvider()
funcProvider.installFunctions(BuiltInFunction.string)
let formulitic = Formulitic(functionProvider: funcProvider)
let formula = formulitic.parse(formulaString)
let result = formula.evaluate()
// the result is a NumerableValue whose number is 6".
需求
- iOS 8.0+
- Swift 4.2+
安装
CocoaPods
Formulitic 通过 CocoaPods 提供。要安装它,请简单地将其添加到您的 Podfile 中以下行
use_frameworks!
pod "Formulitic"
Carthage
Formulitic 通过 Carthage 提供。要安装它,只需将以下行添加到您的 Cartfile 中
github "hironytic/Formulitic"
作者
Hironori Ichimiya,[email protected]
许可协议
Formulitic 基于 MIT 许可协议。有关更多信息,请参阅 LICENSE 文件。