在Ojective-C中我写道:
id <MyProtocol> object = [[NSClassFromString(@"aClassName") alloc] initWithObject:obj];
我想在Swift中写这个。
有没有做同样的事情,还是我没有语言范式?
编辑:
这是我的背景。 在某处我有:
- (instancetype)initWithObject:(NSArray *)array andClassName:(NSString *)className {
self = [self initWithClassName:className];
if(self) {
_members = [[NSMutableArray alloc] init];
for(id obj in array) {
id <MyProtocol> object = [[NSClassFromString(className) alloc] initWithObject:obj];
[_members addObject:object];
};
}
return self;
}
答案 0 :(得分:1)
在Swift中,你需要一个泛型类。
您的类将具有通用类型<T : MyProtocol>
,members
类型为[T]
,您可以使用T
创建新实例。
您无需将className
作为参数传递。
答案 1 :(得分:1)
为了在类上调用该初始化程序,您需要知道该类支持该初始化程序。因此,让我们制作MyProtocol
协议所需的初始化程序:
protocol MyProtocol {
init(object: AnyObject)
}
然后您可以执行NSClassFromString
,然后将结果转换为MyProtocol.Type
(断言该类是MyProtocol
的子类型),这允许您使用初始化程序想:
let object = (NSClassFromString(className) as! MyProtocol.Type)(object: obj)