2013-03-24 19 views
1

我是編程新手。我想向ddmathparser添加一些新功能,例如衍生產品和集成。我能找到的唯一一個是關於ddmathparser的維基頁面https://github.com/davedelong/DDMathParser/wiki/Adding-New-Functions的簡短教程。然而,我無法遵循它,因爲它太短,讀了好幾遍之後,我仍然不明白它在做什麼。那麼,任何人都可以詳細說明添加新功能的步驟,或者給我更詳細的教程嗎? 我真的做了我的研究,但我找不到一個。非常感謝。任何人都可以指向在ddmathparser中添加新函數的教程嗎?

回答

1

DDMathParser作者在這裏。

這裏是你如何添加multiply by two功能:

DDMathEvaluator *evaluator = [DDMathEvaluator sharedMathEvaluator]; 
// a function takes arguments, variable values, the evaluator, and an error pointer 
// and returns a new expression 
[evaluator registerFunction:^DDExpression *(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError *__autoreleasing *error) { 
    DDExpression *final = nil; 

    // multiplyBy2() can only handle a single argument 
    if ([args count] == 1) { 
     // get the argument and simply wrap it in a "multiply()" function 
     DDExpression *argExpression = [args objectAtIndex:0]; 
     DDExpression *twoExpression = [DDExpression numberExpressionWithNumber:@2]; 
     final = [DDExpression functionExpressionWithFunction:DDOperatorMultiply arguments:@[argExpression, twoExpression] error:nil]; 
    } else if (error) { 
     // there wasn't only one argument 
     NSString *description = [NSString stringWithFormat:@"multiplyBy2() requires 1 argument. %ld were given", [args count]]; 
     *error = [NSError errorWithDomain:DDMathParserErrorDomain code:DDErrorCodeInvalidNumberOfArguments userInfo:@{NSLocalizedDescriptionKey: description}]; 
    } 
    return final; 

} forName:@"multiplyBy2"]; 

現在你可以這樣做:

NSNumber *result = [@"multiplyBy2(21)" stringByEvaluatingString]; 

,並取回@42


這是怎麼回事:

內部,DDMathEvaluator基本上有一個大NSDictionary,保存着所有它知道的功能列表,鍵控關閉該功能的名稱,種類如下:

_functions = @{ 
    @"multiply" : multiplyFunctionBlock, 
    @"add" : addFunctionBlock, 
    ... 
}; 

(顯然,這是比這更復雜一點,但是這是基本的想法)

當評估Ë評估一個字符串並且遇到一個函數,它在這個字典中查找該函數的塊是什麼。它檢索塊,然後用字符串中的參數(如果有的話)執行該塊。該塊的結果是該函數的結果。

該結果被替換回來,評估繼續。

+0

謝謝。現在我明白這是如何工作的。那麼我應該在哪裏放置代碼?在需要該功能的文件中還是在DDMathParser文件之一中? – zyl1024 2013-03-24 14:48:43

+2

@ zyl1024把它放在你自己的代碼中。 – 2013-03-24 14:50:13

+0

謝謝,尤其是對於添加的解釋。 – zyl1024 2013-03-24 15:31:53

相關問題