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.
感谢您的耐心等待!
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()函数,该函数需要三个参数.根据第一个参数的计算方式,它可以计算第二个或第三个参数的结果.
您需要做的另一件事是告诉评估者什么height和weight意思.由于它们不是以$字符开头,因此它们被解释为函数,而不是变量.如果他们以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开头$,因此它们是函数,这意味着您需要告诉评估者函数评估的内容.您可以通过两个创建函数做到这一点height和weight,就像你一样的if:
[evaluator registerFunction:^DDExpression *(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError **error) {
return [DDExpression numberExpressionWithNumber:@42];
} forName:@"height"];
Run Code Online (Sandbox Code Playgroud)
或者,您可以使它更动态并使用functionResolver块DDMathEvaluator,这是一个块返回一个块(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和提供的价值height和weight),你可以这样做:
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允许未知函数回退到提供的变量值,但我还没完成它)
您必须编写自己的解释器或找到支持此类表达式的解释器。
第一部分(条件)可以通过 进行评估NSPredicate。对于第二部分(计算),您将需要一些数学表达式评估。试试这个https://github.com/davedelong/DDMathParser。也许你可以两者都做,DDMathParser但我不确定。
| 归档时间: |
|
| 查看次数: |
406 次 |
| 最近记录: |