我有一个包含结构的xml文件。在这个结构中,我有Actions节点。因此,在Actions节点下,有多个“Action”节点,每个节点都有Value和Name属性。
e.g。
<?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中创建的方法。
e.g。
@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 :(得分:1)
您可以创建NSInvocation
实例,设置选择器,参数,并可选择捕获返回值。你可以用字符串创建所有这些。
e.g。
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开始。
答案 1 :(得分:0)
通过一些基本的字符串操作,您可以将"Enter first operand"
转换为NSString @"enterFirstOperand"
。
请参阅componentsSeparatedByString:
,capitalizedString
和-[NSArray componentsJoinedByString:]
您可以使用NSSelectorFromString()
来创建SEL(选择器)。您可以使用[self performSelector:aSelecor]
,[self performSelector:aSelector withObject:object afterDelay:0]
或variants执行此操作。
要检查某个选择器是否有效,请使用responseToSelector:
。
你会发现很多关于它的帖子。