Swift:创建一个以类类型作为参数的工厂函数,并输出该类的构造函数

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中这样的事情可能吗?我已经在网上研究了一段时间,似乎找不到任何直接的答案.任何帮助将不胜感激!

Nat*_*ook 7

让我们倒退吧.在您的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)