【问题标题】:Create instance of class known at runtime in Swift在 Swift 中创建在运行时已知的类的实例
【发布时间】:2015-01-08 11:28:26
【问题描述】:

一张图抵千言,如何将这段代码从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 中使用固定初始化程序创建具有动态类的实例。然而,在 Swift 中使用动态选择器调用方法(或本例中的初始化器)通常是不可能的,因为它从根本上是不安全的(选择器不携带被调用方法的类型信息)。

标签: swift dynamic instantiation


【解决方案1】:

这不能纯粹在 Swift 中完成。您只能通过在 Objective C 中创建“按名称创建者的类实例”并从 Swift 调用此代码来做到这一点。

有关更多信息,您可以阅读这篇文章。 http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/

并查看这个 github 存储库 https://github.com/ijoshsmith/swift-factory

【讨论】:

    【解决方案2】:

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

    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
    

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

    【讨论】:

      【解决方案3】:

      查看 matt 的出色回答 here。基本上使用@objc,您可以模拟实例的动态创建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多