我正在使用命令行工具来运行方法
- [NSMutableDictionary setObject:(id)object forKey:(NSString *)key]
我想要传递的值object
是字符串argv[4]
的内容...所以用户会输入:
mytool arg1 arg2 arg3 [NSString stringWithFormat:@"asd"]
仍然,普通argv[4]
显然是char*
,因此我无法将其添加为object
。
有没有办法在普通对象中将对象作为其内容转换为该字符串,以便我可以在上面的方法中传递它?
存在:将"[NSString stringWithFormat:@"asd"]"
变为[NSString stringWithFormat:@"asd"]
?
注意:这适用于任何Objective-C对象,因此我也可以像argv[4]
那样传递[NSArray arrayWithObjects:@"obj1", nil]
。
提前致谢。
答案 0 :(得分:1)
一般来说,没有。编写自己的解释器或获取字符串并通过编译器运行它没有通用的方法将包含任意Objective-C表达式的字符串转换为该表达式的值。
现在,如果您将操作专门限制为
"[" <ClassName> <MethodName>":"<LiteralParameter> "]"
或者其他一些,你可以编写一个只有适度复杂的解释器来查找类名,解析文字,然后调用选择器。这可以推广到处理逗号分隔列表等,没有太多困难。
答案 1 :(得分:1)
这是一个在运行时将C字符串转换为类和选择器的简短示例。
// I added arg5 and arg6 for the example
// mytool arg1 arg2 arg3 NSString stringWithFormat: asd
NSString *className = [[NSString alloc] initWithUTF8String:arg4];
NSString *selectorName = [[NSString alloc] initWithUTF8String:arg5];
NSString *argument = [[NSString alloc] initWithUTF8String:arg6];
Class myClass = NSClassFromString(className);
SEL mySelector = NSSelectorFromString(selectorName);
// If arg5 is a class method
[myClass performSelector:mySelector withObject:argument];
// or if arg5 is an instance method
id instance = [[myClass alloc] init];
[instance performSelector:mySelector withObject:argument];
这是一个包含三个令牌的简单示例:NSString
,stringWithFormat:
和一个参数。要处理更复杂的情况,您需要编写自己的字符串解析器。不过,它向您展示了一些可能性。
答案 2 :(得分:0)
您可以使用此NSString实例方法-(id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding
将您的C String转换为NSString对象,然后添加到NSMutableDictionary