iphone – 如何在iOS中解决条件方程式
我想在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允许未知功能回退到提供的变量值,但是我还没有完成) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Cocos2dx在Android环境下自动包含所有文件
- NoSQL架构实践(二)——以NoSQL为主
- ruby-on-rails – 编写二进制文件时的Encoding :: Undefine
- Cocos2dx学习笔记35 CCArray使用注意事项
- c# – Properties.Settings.Default.Save()将user.config文
- Flex Viewer解析-----InfoPopup(InfoWindow)
- 解决用EasyDarwin开源流媒体服务器做HLS直播时Flash Player
- Oracle 9i产品文档
- dataBase.setTransactionSuccessful();的作用是什么
- H3C路由器多出口NQA+TRACK实现冗余