使用 swift 中的协议和 class 名称的对象初始化
Object initialization with protocol and class name in swift
在 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;
}
在 Swift 中,您将需要一个通用的 class。
您 class 将具有泛型类型 <T : MyProtocol>
,members
将属于 [T]
类型,您可以使用 T
创建新实例。
您不需要将 className
作为参数传递。
为了在 class 上调用该初始化程序,您需要知道 class 支持该初始化程序。因此,让我们创建 MyProtocol
协议所需的初始化程序:
protocol MyProtocol {
init(object: AnyObject)
}
然后你可以只做 NSClassFromString
,然后将结果转换为 MyProtocol.Type
(断言 class 是 MyProtocol
的子类型),这允许你使用你想要的初始化器:
let object = (NSClassFromString(className) as! MyProtocol.Type)(object: obj)
在 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;
}
在 Swift 中,您将需要一个通用的 class。
您 class 将具有泛型类型 <T : MyProtocol>
,members
将属于 [T]
类型,您可以使用 T
创建新实例。
您不需要将 className
作为参数传递。
为了在 class 上调用该初始化程序,您需要知道 class 支持该初始化程序。因此,让我们创建 MyProtocol
协议所需的初始化程序:
protocol MyProtocol {
init(object: AnyObject)
}
然后你可以只做 NSClassFromString
,然后将结果转换为 MyProtocol.Type
(断言 class 是 MyProtocol
的子类型),这允许你使用你想要的初始化器:
let object = (NSClassFromString(className) as! MyProtocol.Type)(object: obj)