在Swift中调用只具有类名的初始化程序

时间:2014-07-31 00:28:27

标签: ios swift initializer

我想知道是否有办法通过在Swift中使用类名来调用初始化程序。

class Shape {
  let name: String
  var numberOfSides: Int?

  init(name: String) {
    self.name = name
  }
}

伪代码:

let shapeClass = stringToClass("Shape")

let shape: Shape = shapeClass(name: "Something")

1 个答案:

答案 0 :(得分:5)

不仅仅是尝试调用类函数,而是尝试动态调用初始值设定项。为了能够在运行时获得的类上动态调用初始化程序,该类值的编译时类型必须是具有该初始化程序的类的元类型;但由于初始化程序并不总是在Swift中继承,因此必须将该初始化程序声明为required

这里我们使用NSClassFromString从字符串中获取一个类。 (我使用显式名称将类声明为@objc,因为否则Swift类名称会从Objective-C的角度被破坏,并且处理它会很麻烦。)但是,它返回AnyClass(即AnyObject.Type),这是一个元数据类型,其值是任何类。我们希望它仅限于继承自Shape的类,因此我们可以使用Shape的初始值设定项,因此我们将其转换为Shape.Type(其值为类的元类型)从Shape下降,包括在内。

我还通过简单地更改名称来证明它是多态的,因为它与子类的名称一起使用。

import Foundation
@objc(Shape)
class Shape {
  let name: String
  var type: String

  required init(name: String) {
    self.name = name
    self.type = "Shape"
  }
}
@objc(SubShape)
class SubShape : Shape {
  required init(name: String) {
    super.init(name: name)
    self.type = "SubShape"
  }
}
let shapeClass = NSClassFromString("SubShape") as Shape.Type
let shape: Shape = shapeClass(name: "Something")
println(shape.type) // prints "SubShape"