DDMathParser 作者在这里。
如果替换字典中不存在变量,是否可以将变量设置为默认值?
有点儿。您可以通过向variableResolver
数学评估器提供一个块来做到这一点:
DDMathEvaluator *evaluator = [DDMathEvaluator sharedMathEvaluator];
[evaluator setVariableResolver:^(NSString *variable) { return @0; }];
NSNumber *n = [evaluator evaluateString:myString withSubstitutions:mySubstitutions];
每当评估器遇到在替换字典中找不到的变量时,都会执行变量解析器块。
向 DDMathParser 添加一个自定义函数是否可行,例如 defaultZero($b) 如果变量 b 存在则检索变量 b 如果不存在则检索为零?
嗯,聪明的主意。你可以,但你基本上是通过模仿 variableResolver 块的行为。您将创建一个新DDMathFunction
块并使用-[DDMathEvaluator registerFunction:forName:]
告诉评估者它。
但是,我建议只提供一个变量解析器块。会简单很多。
以下是您如何定义一个defaultZero
返回参数值或0
(如果参数无法评估)的函数:
DMathEvaluator *evaluator = [DDMathEvaluator sharedMathEvaluator];
[evaluator registerFunction:^DDExpression *(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError *__autoreleasing *error) {
NSNumber *argValue = nil;
if ([args count] == 1) {
// defaultZero() only supports a single argument
// for anything else, return 0
DDExpression *arg = [args objectAtIndex:0];
NSError *argError = nil;
argValue = [eval evaluateExpression:arg withSubstitutions:vars error:&argError];
}
if (argValue == nil) {
// return 0 if either the arg can't be eval'd or there isn't 1 arg
argValue = @0;
}
return [DDExpression numberExpressionWithNumber:argValue];
} forName:@"defaultZero"];