objective-c で eval的な動きを実装するには

さて、今回は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

最低限しかやっていませんが、ラベル変更ボタンを押したらラベルの内容が変わります。

ポイントは、インスタンスしたラベルのコントロールを配列にセットし
呼び出す時は、一時的にコントロールを作成(コピー?)して指定する事です。

なんか、不自然な気もしますが取り敢えずこれで動きます。

※マズイ点があれば、ご指摘いただけますと幸いです。。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です