在Swift中创建运行时已知的类的实例
一张图片胜过千言万语,如何将这段代码从Objective-C改写成Swift在Swift中创建运行时已知的类的实例,swift,dynamic,instantiation,Swift,Dynamic,Instantiation,一张图片胜过千言万语,如何将这段代码从Objective-C改写成Swift - (id) instanceOfClass: (Class) class withInitializer: (SEL) initializerSelector withObject: (id) object { id obj = nil; if([class instancesRespondToSelector:initializerSelector]) { obj = [[class
- (id) instanceOfClass: (Class) class withInitializer: (SEL) initializerSelector withObject: (id) object {
id obj = nil;
if([class instancesRespondToSelector:initializerSelector]) {
obj = [[class alloc] performSelector:initializerSelector
withObject:object];
}
return obj;
}
id myViewController = [self instanceOfClass:[ViewController class]
withInitializer:@selector(initWithObject:)
withObject:@"super-string!"];
NSLog(@"%@", myViewController);
这不能完全用Swift来实现。您只能通过在Objective C中创建“名称创建者类实例”并从Swift调用此代码来实现这一点 有关更多信息,请阅读本文。 看看这个github回购
如果您可以使类成为公共超类的子类,则可以执行以下操作:
class C {
var typ:String
init() {
self.typ = "C"
}
class func newInst() -> C {
return C()
}
}
class C1 : C {
override init() {
super.init()
self.typ = "C1"
}
override class func newInst() -> C1 {
return C1()
}
}
class C2 : C {
override init() {
super.init()
self.typ = "C2"
}
override class func newInst() -> C2 {
return C2()
}
}
var CL:C.Type = C1.self
CL = C2.self
var inst = CL.newInst()
inst.typ
如果没有,那么您可以使用闭包或块来创建实例,并按名称将它们放入字典中。参见matt的精彩答案。基本上,使用
@objc
可以模拟实例的动态创建。难点不在于动态类,而在于动态选择器。可以使用固定的初始值设定项在Swift中使用动态类创建实例。但是,在Swift中,使用动态选择器调用方法(或在本例中使用初始值设定项)通常是不可能的,因为它从根本上是不安全的(选择器不携带被调用方法的类型信息)。