如何在iOS中解决条件方程

Sag*_*hav 10 iphone macos xcode ios

我想在iOS中解决一个条件方程:

我从数据库得到的等式是NSString格式,例如:

if((height > 0), (weight+ 2 ), ( weight-1 ) )
Run Code Online (Sandbox Code Playgroud)

根据我们的理解,如果我解析上面的字符串和单独的height>0条件,它将采用NSString格式.但要评估它如何将字符串转换为条件语句?

一旦获得条件语句,可以通过将其转换为三元方程来求解方程式,如下所示:

Bool status;

NSString *condition=@” height>0”;

If(condition)    //But condition is treated as a string and not as a conditional statement.
{
    status=True;
}
else
{
    status=False;
}

Return status ? weight+ 2 : weight-1;`
Run Code Online (Sandbox Code Playgroud)

方程也可以动态改变,因此它们不能被硬编码.简而言之,我如何解决这个我得到的等式NSString.

感谢您的耐心等待!

Dav*_*ong 5

DDMathParser作者在这里......

为了扩展Jonathan的答案,以下是如何在DDMathParser中完全完成的.但是,要按原样解析字符串,您需要做两件事.

首先,您需要创建一个if函数:

DDMathEvaluator *evaluator = [DDMathEvaluator sharedMathEvaluator];
[evaluator registerFunction:^DDExpression *(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError *__autoreleasing *error) {
    if ([args count] == 3) {
        DDExpression *condition = [args objectAtIndex:0];
        DDExpression *resultExpression = nil;
        NSNumber *conditionValue = [condition evaluateWithSubstitutions:vars evaluator:eval error:error];
        if ([conditionValue boolValue] == YES) {
            resultExpression = [args objectAtIndex:1];
        } else {
            resultExpression = [args objectAtIndex:2];
        }
        NSNumber *result = [resultExpression evaluateWithSubstitutions:vars evaluator:eval error:error];
        return [DDExpression numberExpressionWithNumber:result];
    }
    return nil;

} forName:@"if"];
Run Code Online (Sandbox Code Playgroud)

这将创建if()函数,该函数需要三个参数.根据第一个参数的计算方式,它可以计算第二个或第三个参数的结果.

您需要做的另一件事是告诉评估者什么heightweight意思.由于它们不是以$字符开头,因此它们被解释为函数,而不是变量.如果他们以a开头$,那就像评估它一样简单:

NSString *expression = @"if(($height > 0), ($weight+ 2 ), ( $weight-1 ) )";
NSDictionary *variables = @{@"height" : @42, @"weight" : @13};
NSNumber *result = [expression evaluateWithSubstitutions:variables evaluator:evaluator error:nil];
Run Code Online (Sandbox Code Playgroud)

但是,由于它们不是以a开头$,因此它们是函数,这意味着您需要告诉评估者函数评估的内容.您可以通过两个创建函数做到这一点heightweight,就像你一样的if:

[evaluator registerFunction:^DDExpression *(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError **error) {
    return [DDExpression numberExpressionWithNumber:@42];
} forName:@"height"];
Run Code Online (Sandbox Code Playgroud)

或者,您可以使它更动态并使用functionResolverDDMathEvaluator,这是一个块返回一个块(woooooo),看起来像这样:

NSDictionary *values = @{@"height": @42, @"weight": @13};
[evaluator setFunctionResolver:^DDMathFunction(NSString *name) {
    DDMathFunction f = ^(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError **error) {
        NSNumber *n = [values objectForKey:name];
        if (!n) { n = @0; }
        return [DDExpression numberExpressionWithNumber:n];
    };
    return f;
}];
Run Code Online (Sandbox Code Playgroud)

有了这两个片(注册if和提供的价值heightweight),你可以这样做:

NSString *expression = @"if((height > 0), (weight+ 2 ), ( weight-1 ) )";
NSNumber *result = [expression evaluateWithSubstitutions:nil evaluator:evaluator error:nil];
Run Code Online (Sandbox Code Playgroud)

...并取回正确的结果@15.

(我计划DDMathParser允许未知函数回退到提供的变量值,但我还没完成它)


Jon*_*hon 4

您必须编写自己的解释器或找到支持此类表达式的解释器。

第一部分(条件)可以通过 进行评估NSPredicate。对于第二部分(计算),您将需要一些数学表达式评估。试试这个https://github.com/davedelong/DDMathParser。也许你可以两者都做,DDMathParser但我不确定。