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

标签 swift inheritance constructor swift2

我想创建一个接受类类型并返回构造函数的工厂函数,以便稍后可以使用该构造函数创建该类的实例。

假设我有两个类,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/

相关文章:

ios - 如何将实时表格 View 选择的单元格计数器作为 UIBarButtonItem

java对象比较与继承

c++ - 错误 : no matching function for call

javascript - 为什么这个属性是在原型(prototype)上定义的,而不是在构造函数上?

c++ - 继承,调用基类构造器

ios - 在 Xcode 项目中添加 Pods 或 CocoaPods 的最快方法

ios - 无法在 Swift 中将变量传递给 prepareForSegue?

ios - 分享 Gifs Swift

python - Django 1.7.1 : Child model, 删除对父模型的所有引用并让子模型继承自爷爷

c++ - 使用 Parent 构造函数初始化子类