在 Swift 中创建运行时已知的 class 实例
Create instance of class known at runtime in Swift
一图抵千言,如何将这段代码从Objective-C改写成Swift?
- (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 中创建 "class instance by name creator" 并从 Swift.
调用此代码来执行此操作
有关更多信息,您可以阅读本文。
http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/
并查看此 github 存储库
https://github.com/ijoshsmith/swift-factory
如果你可以让你的 类 成为一个普通超类的子类,你可以这样做:
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 的出色回答 here。基本上使用 @objc
你可以模拟实例的动态创建。
一图抵千言,如何将这段代码从Objective-C改写成Swift?
- (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 中创建 "class instance by name creator" 并从 Swift.
调用此代码来执行此操作有关更多信息,您可以阅读本文。 http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/
并查看此 github 存储库 https://github.com/ijoshsmith/swift-factory
如果你可以让你的 类 成为一个普通超类的子类,你可以这样做:
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 的出色回答 here。基本上使用 @objc
你可以模拟实例的动态创建。