2012-03-28 65 views
4

我有一個包含結構的xml文件。在這個結構中,我有Actions節點。因此在Actions節點下,有多個「Action」節點,每個節點都具有Value和Name屬性。如何將xml(對象)映射到Objective-C中的方法?

例如

<?xml version="1.0" encoding="ISO-8859-1"?> 

<Testcases SuiteName="CalculatorActions"> 

    <Testcase id="101" Name="testAddFunction"> 
     <Setup/> 
     <TearDown/> 
     <Test> 
      <Action Name="Enter first operand" Type="input" Value="5"/> 
      <Action Name="Enter second operand" Type="input" Value="3"/> 
      <Action Name="Select operator" Type="input" Value="+"/> 
      <Action Name="Click Calculator" Type="operation"/> 
     </Test> 
     <Validations> 
      <Action Name="Validate result" Type="output" Value="8"/> 
     </Validations> 
    </Testcase> 

</Testcases> 

我想要做的是;我想將這些動作映射到我在Objective-C中實現的方法。

比方說,我有一個叫做「 「CalculatorActions」並定義了5種方法。我想將xml(文本格式)中的動作映射到我在CalculatorActions中創建的方法。

例如

@interface CalculatorActions : NSObject 

// Property 
@property (strong, nonatomic) NSString* actionScript; 

// Actions 
- (void)enterFirstOperand:(double)operand; 

- (void)enterSecondOperand:(double)operand; 

- (void)selectOperator:(NSString*)operator; 

- (void)clickCalculate; 

// Validations 

-(void)validateResult:(NSString*)exptectedResult; 

@end 

因此,當我讀取xml文件時,我想將xml文件中的動作映射到類中的相應方法。

我覺得我在找什麼東西,

@interface CalculatorActions 

[Action("addOperand", "Enter first operand")] 
- (void) addOperand:(double)operand1 ToOther:(double)operand2; 

這樣做的最佳方法是什麼?

+0

開始什麼是您使用翻譯的動作名稱的方法名稱的規則?因爲在這個例子中你已經表明他們不一樣。 – Perception 2012-03-28 00:19:48

回答

1

您可以創建一個NSInvocation實例,設置選擇器,參數並可選地捕獲返回值。你可以用字符串創建這些。

例如

SEL mySelector = NSSelectorFromString(@"testAddFunction"); 
Class MyClass = NSClassFromString(@"CalculatorActions"); 
NSString *myArgument = @"5"; 

NSInvocation *myInvocation = [NSInvocation invocationWithMethodSignature:[MyClass instanceMethodSignatureForSelector:mySelector]]; 
[invocation setTarget:myClass]; 
[invocation setSelector:mySelector]; 
[invocation setArgument:&myArgument atIndex:2]; 
[invocation invoke]; 

注 - setArgument:選擇需要一個指針地址和自變量的指數在2

+0

+1提到的NSInvocation,它允許您正在調用的參數。 performSelector也將工作,但僅限於一個「withObject」 – bryanmac 2012-03-28 01:35:17

+0

謝謝你解決了這個問題。 – 2012-03-31 02:10:29

0

通過一些基本的字符串操作,您可以將"Enter first operand"轉換爲NSString @"enterFirstOperand"

看到componentsSeparatedByString:capitalizedString-[NSArray componentsJoinedByString:]

比你可以使用NSSelectorFromString(),創建SEL(選擇)。您可以使用[self performSelector:aSelecor],[self performSelector:aSelector withObject:object afterDelay:0]variants執行此操作。

若要檢查某個選擇器是否可以正常工作,請使用responseToSelector:

爲解析本身,你會發現很多後處理它。