以下のようにして実装してみた。
params
// 文字列として必要クラスなどのデータを保持している想定
NSDictionary *paramInfo = @{ @"className": @"AnyClass",
@"paramName": @"setFloat:",
@"type": @"float",
@"value": @(0.5),};
実装
NSMethodSignature
と NSInvocation
を利用する。
- (id)createInstanceWithDictionary:(NSDictionary *)paramInfo
{
Class class = NSClassFromString(paramInfo[@"className"]);
__autoreleasing __typeof(class) instance = [[class alloc] init];
SEL sel = NSSelectorFromString(paramInfo[@"paramName"]);
CGFloat val = [paramInfo[@"value"] doubleValue];
NSMethodSignature *signature = [class instanceMethodSignatureForSelector:sel];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
invocation.selector = sel;
invocation.target = instance;
[invocation setArgument:&val atIndex:2];
[invocation invoke];
return instance;
}
文字列で実行することの是非はあると思うけど、とりあえず動かすことができた。