在Objective-C中将变量的值作为动态代码使用?
在Objective-C中将变量的值作为动态代码使用?
我在网上找不到帮助,这让我觉得我所尝试的可能是不可能的,但我还是要问一下!我刚接触obj-c,只是为了好玩而开发...\n我试图根据从另一个数组随机选取的字符串来调用一个数组。我有一个名为pickerArray的NSArray,其中包含字符串:oneArray,twoArray作为示例。\n我还有一个NSString(pickerString),一个NSArray(oneArray)和一个NSArray(twoArray)。\n我可以随机选择字符串,但我无法将此字符串的值用作“code”\nrandomNumber = arc4random()%[pickerString count];\n根据选择的字符串,pickerString应该读取为oneArray或twoArray,即:\nrandomNumber = arc4random()%[oneArray count];\n或者:\nrandomNumber = arc4random()%[twoArray count];\n根据选择的字符串。\n编辑:我目前的代码是:\n@implementation FirstViewController{\nIBOutlet UITextView *doThis;\n}\n- (IBAction)takeATurn:(id)sender {\nint pickerNumber;\nint randomNumber;\nNSString *pickerString;\nNSString *textString;\nNSArray *pickerArray;\nNSArray *oneArray;\nNSArray *twoArray;\npickerArray = [NSArray arrayWithObjects:\n @\"oneArray\",\n @\"twoArray\",\n nil];\noneArray = [NSArray arrayWithObjects:\n @\"example text to display\",\n @\"expmple text to display 2\",\n nil];\ntwoArray = [NSArray arrayWithObjects:\n @\"example text to display in array two\",\n @\"expmple text to display in array two 2\",\n nil];\npickerNumber = arc4random()%[pickerArray count];\npickerString = [pickerArray objectAtIndex:pickerNumber];\nrandomNumber = arc4random()%[NSArray(pickerString) count];\n //不能编译 - 应该是[oneArray count];(或oneArray的位置上的twoArray)\ntextString = [NSArray(pickerString) objectAtIndex:randomNumber];\n //与上述相同。\ndoThis.text = textString;\n}\n谢谢任何帮助。\nMike
问题原因:这个问题涉及到了关键值编码(key-value coding)的使用。代码中的`[self valueForKey:pickerString]`会返回一个名为`pickerString`的属性。但是,这种写法需要将数组移动到实例属性中,而不是局部变量中。
解决方法:将数组移动到实例属性中。具体做法是在`FirstViewController`类中声明以下实例属性:
@property (nonatomic, readwrite, strong) NSArray *pickerArray; @property (nonatomic, readwrite, strong) NSArray *oneArray; @property (nonatomic, readwrite, strong) NSArray *twoArray;
然后,在初始化对象时(如`viewWillAppear`方法中),给这些属性赋上相应的值。最后,在`takeATurn`方法中,使用`self.pickerArray`获取随机数组名,再使用`[self valueForKey:pickerString]`获取对应的数组。
文章整理如下:
这是一个关键值编码的问题:
NSArray *arrayToUse = [self valueForKey:pickerString];
这行代码会返回一个名为`pickerString`的属性。
为了让这个代码按照你的期望工作,将数组移动到实例属性中,而不是局部变量中。
编辑部分:
@interface FirstViewController () @property (nonatomic, readwrite, weak) IBOutlet UITextView *doThis; @property (nonatomic, readwrite, strong) NSArray *pickerArray; @property (nonatomic, readwrite, strong) NSArray *oneArray; @property (nonatomic, readwrite, strong) NSArray *twoArray; @end @implementation FirstViewController - (void)viewWillAppear:(BOOL)animated { self.pickerArray = @[@"oneArray", @"twoArray"]; self.oneArray = @[@"example text to display", @"example text to display 2"]; self.twoArray = @[@"example text to display in array two", @"example text to display in array two 2"]; } - (IBAction)takeATurn:(id)sender { int pickerNumber = arc4random_uniform([self.pickerArray count]); NSString *pickerString = pickerArray[pickerNumber]; NSArray *array = [self valueForKey:pickerString]; int randomNumber = arc4random_uniform([array count]); NSString *textString = array[randomNumber]; self.doThis.text = textString; } @end
非常感谢您的及时帮助!我非常感激,正如我所说,我只是为了好玩而学习一下,我在北海控制一座油井,有时候可能没有什么事情可做!
我可能已经醒太久了,但我仍然遇到了一些困难!
谢谢,这又是非常大的帮助,我在`int randomNumber = arc4random_uniform(array count]) NSString textString = array[randomNumber];`这里遇到一些编译问题(除了缺少括号和分号之外)。显示了“需要标识符”和“接口类型无法静态分配”的错误。我明天再试一次 🙂
感谢您的意见,我现在已经解决了问题,并且我相信我也理解了! 😉 再次感谢,Mike