Formulitic 0.3.0

Formulitic 0.3.0

Hironori Ichimiya维护。



  • 作者:
  • Hironori Ichimiya

Formulitic

CI Status Version License Platform Carthage compatible

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 文件。