加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

iphone – 如何在iOS中解决条件方程式

发布时间:2020-12-14 19:49:50 所属栏目:百科 来源:网络整理
导读:我想在iOS中解决条件方程: 从数据库得到的方程式是NSString格式,例如: if((height 0),(weight+ 2 ),( weight-1 ) ) 根据我们的理解,如果我解析了上面的字符串并且分开了 0condition,它将是NSString格式.但是要评估它如何将字符串转换为条件语句? 一旦得到
我想在iOS中解决条件方程:

从数据库得到的方程式是NSString格式,例如:

if((height > 0),(weight+ 2 ),( weight-1 ) )

根据我们的理解,如果我解析了上面的字符串并且分开了> 0condition,它将是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;`

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

感谢您的耐心等待!

解决方法

DDMathParser作者在这里…

要扩展到Jonathan’s answer,您可以在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"];

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

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

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

但是,由于它们不是以$开头,它们是函数,这意味着需要告诉评估者什么是评估函数.您可以通过创建高度和重量的功能来完成此操作,就像您所做的那样:

[evaluator registerFunction:^DDExpression *(NSArray *args,NSError **error) {
    return [DDExpression numberExpressionWithNumber:@42];
} forName:@"height"];

或者,您可以使其更具动态性,并使用DDMathEvaluator的functionResolver块,该块是返回块(woooooo)的块,如下所示:

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

有了这两个部分(注册并提供高度和重量的值),你可以做:

NSString *expression = @"if((height > 0),( weight-1 ) )";
NSNumber *result = [expression evaluateWithSubstitutions:nil evaluator:evaluator error:nil];

…并得到@ 15的正确结果.

(我有计划让DDMathParser允许未知功能回退到提供的变量值,但是我还没有完成)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读