我想创建一个接受类类型并返回构造函数的工厂函数,以便稍后可以使用该构造函数创建该类的实例。
假设我有两个类,Apple 和 Orange,它们都是 Fruit 的子类。它们需要用 unknownNumber
进行初始化,我以后才知道。
class Apple: Fruit {
init(unknownNumber: Int) {
...
}
}
class Orange: Fruit {
init(unknownNumber: Int) {
...
}
}
我想创建一个接收 Class 类型的工厂函数,以便我稍后可以调用此函数并使用 unknownNumber 初始化 Fruit 的特定子类。
//concept:
func makeFruit(typeOfFruit) -> (Int) -> Fruit {
return { (unknownNumber: Int) -> Fruit in
return typeOfFruit(unknownNumber)
}
}
要创建一个 orangeFactory,那么,我可以这样做:
let orangeFactory = makeFruit(Orange)
// then at a later time when I have the unknown number
let orangeInstance = orangeFactory(unknownNumber)
我知道简单地使 unknownNumber
成为惰性变量的选项,但在我的特定情况下,unknownNumber
不仅仅是一个数字,它还涉及其他进程,所以我只想在一切可用时创建对象,以保持结构简单。
在 Swift 中可以实现这样的功能吗?我已经在网上研究了一段时间,但似乎找不到任何直接的答案。任何帮助将不胜感激!
最佳答案
让我们逆向工作。在您的 makeFruit
函数中,您需要将 typeOfFruit
参数声明为您的 Fruit
父类(super class)的元类型,并显式引用初始化程序:
func makeFruit(typeOfFruit: Fruit.Type) -> (Int) -> Fruit {
return { (unknownNumber: Int) -> Fruit in
return typeOfFruit.init(unknownNumber: unknownNumber)
}
}
您只能访问元类型上的 required
初始化器,因此 init
需要这样标记:
class Fruit {
required init(unknownNumber: Int) {
// ...
}
}
其余的应该可以正常工作:
let orangeMaker = makeFruit(Orange.self)
let tenOranges = orangeMaker(10)
关于Swift:创建一个将类类型作为参数的工厂函数,并输出该类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34753997/