gok*_*eji 6 inheritance constructor swift swift2
我想创建一个工厂函数,它接受一个类类型并返回一个构造函数,以便我可以使用该构造函数稍后创建该类的实例.
想象一下,我有两个类,Apple和Orange,它们都是Fruit的子类.它们需要初始化unknownNumber,我将在稍后才知道.
class Apple: Fruit {
init(unknownNumber: Int) {
...
}
}
class Orange: Fruit {
init(unknownNumber: Int) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个接受Class类型的工厂函数,以便稍后我可以使用unknownNumber调用此函数并初始化Fruit的特定子类.
//concept:
func makeFruit(typeOfFruit) -> (Int) -> Fruit {
return { (unknownNumber: Int) -> Fruit in
return typeOfFruit(unknownNumber)
}
}
Run Code Online (Sandbox Code Playgroud)
要创建一个orangeFactory,那么,我可以这样做:
let orangeFactory = makeFruit(Orange)
// then at a later time when I have the unknown number
let orangeInstance = orangeFactory(unknownNumber)
Run Code Online (Sandbox Code Playgroud)
我知道只是制作unknownNumber一个惰性变量的选项,但在我的具体情况下,unknownNumber它不仅仅是一个数字而且它涉及其他进程,所以我只想在我有一切可用时创建对象,以保持结构简单.
在Swift中这样的事情可能吗?我已经在网上研究了一段时间,似乎找不到任何直接的答案.任何帮助将不胜感激!
让我们倒退吧.在您的makeFruit函数中,您需要将typeOfFruit参数声明为Fruit超类的元类型并显式引用初始化程序:
func makeFruit(typeOfFruit: Fruit.Type) -> (Int) -> Fruit {
return { (unknownNumber: Int) -> Fruit in
return typeOfFruit.init(unknownNumber: unknownNumber)
}
}
Run Code Online (Sandbox Code Playgroud)
您只能访问元类型的required初始值设定项,因此init需要将其标记为:
class Fruit {
required init(unknownNumber: Int) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
其余的应该工作:
let orangeMaker = makeFruit(Orange.self)
let tenOranges = orangeMaker(10)
Run Code Online (Sandbox Code Playgroud)