さて、今回はobjective-cでevalっぽい動きを実装してみます。
このページに辿り着いたあなたは、恐らく大手知恵袋も見ている事かと思います。
そちらにも書かれているように、evalはありません。
私もそうですが、インタプリタの言語から始めているので
evalっぽいのあればと思ってしまいました。
そもそも、evalとはjavascriptなどで利用されている
可変する変数を変数名として使う場合などに利用します。
日本語が変ですが、変数名を文字列で指定るす?という感じです。
var test1 = “hoge”;
var test2 = “hogehoge”;
for(var i = 1; i < 3 ; i++){
alert(eval(“test” + i ));
}
例えば、上のコードの例です。
test1,test2が変数名です。
この変数名を文字列として作成してそれを変数名としてコールします。
これを、objective-c で実装するには配列を使います。
■ecalTestViewController.h
#import <UIKit/UIKit.h>
@interface ecalTestViewController : UIViewController{
NSMutableArray *array;
}
@end
■ecalTestViewController.m
#import "ecalTestViewController.h"
@interface ecalTestViewController ()
@end
@implementation ecalTestViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
array = [[NSMutableArray alloc]init];
UILabel *label1 = [[UILabel alloc]init];
label1.frame = CGRectMake(10, 50, 200, 20);
label1.text = @"ラベル1";
[self.view addSubview:label1];
[array insertObject:label1 atIndex:0];
UILabel *label2 = [[UILabel alloc]init];
label2.frame = CGRectMake(10, 80, 200, 20);
label2.text = @"ラベル2";
[self.view addSubview:label2];
[array insertObject:label2 atIndex:1];
UIButton *btnChange = [[UIButton alloc]init];
btnChange.frame = CGRectMake(10, 120, 100, 20);
[btnChange setTitle:@"ラベル変更" forState:UIControlStateNormal];
[btnChange setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btnChange addTarget:self action:@selector(hoge:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnChange];
}
-(void)hoge:(UIButton*)sender
{
for (int i = 0; i < 2; i++) {
UILabel *wk = [array objectAtIndex:i];
wk.text = [NSString stringWithFormat:@"ラベル変更:%i",i];
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
最低限しかやっていませんが、ラベル変更ボタンを押したらラベルの内容が変わります。
ポイントは、インスタンスしたラベルのコントロールを配列にセットし
呼び出す時は、一時的にコントロールを作成(コピー?)して指定する事です。
なんか、不自然な気もしますが取り敢えずこれで動きます。
※マズイ点があれば、ご指摘いただけますと幸いです。。



