在Swift中创建运行时已知的类实例

时间:2015-01-08 11:28:27

标签: 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 alloc] performSelector:initializerSelector
                                  withObject:object];
    }
    return obj;
}

id myViewController = [self instanceOfClass:[ViewController class]
                              withInitializer:@selector(initWithObject:)
                                   withObject:@"super-string!"];
NSLog(@"%@", myViewController);

3 个答案:

答案 0 :(得分:2)

这不能仅仅在Swift中完成。您只能通过名称创建者"创建"类实例来实现此目的。在Objective C中并从Swift调用此代码。

有关详细信息,请阅读本文。 http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/

看看这个github回购 https://github.com/ijoshsmith/swift-factory

答案 1 :(得分:0)

如果你可以使你的类成为一个公共超类的子类,你可以这样做:

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

如果没有,则可以使用闭包或块来创建实例,并按名称将它们放在字典中。

答案 2 :(得分:0)

见matt的优秀答案here。基本上使用@objc,您可以模仿动态创建实例。