Create instance of class known at runtime in Swift

后端 未结 3 1198
遇见更好的自我
遇见更好的自我 2021-02-14 14:00

A picture is worth a thousand words, how to rewrite this code from Objective-C to Swift?

- (id) instanceOfClass: (Class) class withInitializer: (SEL) initializer         


        
相关标签:
3条回答
  • 2021-02-14 14:24

    See matt's excellent answer here. Basically with @objc you can mimic the dynamic creation of instances.

    0 讨论(0)
  • 2021-02-14 14:25

    If you can make your classes subclasses of a common superclass you can do this:

    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
    

    If not then you can use a closure or block to create the instance and place those in a dictionary by name.

    0 讨论(0)
  • 2021-02-14 14:41

    This cannot be done purely in Swift. You can only do this by creating the "class instance by name creator" in Objective C and calling this code from Swift.

    For more information you can read this article. http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/

    And check out this github repo https://github.com/ijoshsmith/swift-factory

    0 讨论(0)
提交回复
热议问题