在swift中使用协议和类名进行对象初始化

时间:2015-06-11 09:27:39

标签: objective-c swift initialization protocols

在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;
}

2 个答案:

答案 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)