我面临将 NSString 转换为目标 C 的可执行语句的问题。
例如,
NSString *strColorAssembly = @"[UIColor redColor]";
现在,我需要将此字符串转换为可执行代码并传递给 .color 属性。这只是一个例子,我正在尝试构建一个一切都将是动态的项目,所以如果有人能为我提供正确的前进方向,那将非常有帮助。
我不确定您是否可以以编程方式实现该目标。如果是我,我会实现一个接受 NSString(或 NSInteger)并返回 UIColor 的方法。
- (UIColor *)colorDecode:(NSString *)colorPassed
{
if ([colorPassed isEqualToString @"red"])
{
return [UIColor redColor];
}
else if
.
.
.
}
或者
- (UIColor *)colorDecodewithInt:(NSUInteger)colorIndex
{
switch (colorIndex)
{
case (0)
{
return [UIColor redColor];
break;
}
case (1)
.
.
.
.
default
{
return <some default color>;
break;
}
}
}
编辑:我想您也可以使用由 UIColor 对象集合组成的 NSDictionary 。最重要的是,除非您开始使用 CGColor,否则您将被限制在编译代码中预定义的一组颜色,此时您可以开始动态传递 RGB 值。
你不能在 iOS 上做到这一点,期间。iOS 会阻止您分配既可以写入也可以执行的内存页面。
您可以管理的最好的方法是一个解释器,它接收字符串,解析它们,并尝试将它们映射到 Objective-C 调用(使用NSClassFromString
and NSSelectorFromString
)。
我建议不要做你想做的事情,而是使用从 Cocoa 到动态语言的众多绑定之一。我认为最流行的将 Cocoa 绑定到 Lua,这样你就可以编写你的 Lua 代码,一切都会是动态的。
It sounds like what you are looking for is the setValue:ForKey:
method. Anything that conforms to the NSKeyValueCoding Protocol will have that option available. However, this will only work for the key
part (i.e. the name of the property). iOS explicitly prohibits any modification to the distributed code. I would recommend using the key
s as strings and writing some kind of interpreter for the rest of your data.