我想知道是否有办法通过在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")
答案 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"