Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中创建运行时已知的类的实例_Swift_Dynamic_Instantiation - Fatal编程技术网

在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

一张图片胜过千言万语,如何将这段代码从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中创建“名称创建者类实例”并从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中,使用动态选择器调用方法(或在本例中使用初始值设定项)通常是不可能的,因为它从根本上是不安全的(选择器不携带被调用方法的类型信息)。