将对象转换为存储在变量中的Class

Ron*_*huk 6 ios sprite-kit swift

是否可以在变量中存储类类型,然后使用该变量将对象强制转换为该类类型?

我似乎能够将类类型存储在枚举中的变量中,但是我们无法使用此变量将新对象强制转换为此类型.

我有一个子类型的枚举

enum FruitType: Int {

    case orange, apple, lemon, lime

    var className: Fruit.Type {
        switch self {
            case.orange:
                return Orange.self
            case.apple:
                return Apple.self
            case.lemon:
                return Lemon.self
            case.lime:
                return Lime.self
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我有这些游戏对象的子类(橙色,苹果,柠檬和酸橙),它们都继承自"水果"

后来我试图使用该变量将对象强制转换为该类型,但它报告错误

错误"使用未声明类型'fruitType'

func createFruit(fruitType: FruitType, name: String) {
    if let orange = self.childNode(withName: name) as? fruitType.className {
        self.orange = orange
    }
    etc...
}
Run Code Online (Sandbox Code Playgroud)

我也尝试fruitType.className(self.childNode(withName: name))过相同的结果

我已经研究过泛型,但却找不到适合这种情况的东西.

编辑以显示实际的例子

简化了上述问题,使问题更容易说明.我如何处理这个的真正本质是我正在加载一个SKS场景文件作为基于fruitType的SKReferenceNode,我需要相应地转换该SKReferenceNode

func loadFruit(fruitType: FruitType) {

    var fruit: Fruit!
    if let fruitFile = SKReferenceNode(filename: fruitType.fileName) {

        if let fruitNode = fruitFile.childNode(withName: fruitType.name) as? fruitType.className {
             fruitNode.setup()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_* Di -2

也许这会对您有所帮助:

工厂方法:工厂模式用于替代类构造函数,抽象对象生成的过程,使得实例化对象的类型可以在运行时确定。

https://github.com/ochococo/Design-Patterns-In-Swift#-factory-method

  • 当您投反对票时,请人们发表评论,这将帮助谢尔盖·迪和其他人从错误中吸取教训。Sergey Di,不幸的是,工厂方法并不能真正帮助解决 Ron Myschuk 遇到的问题。现在我同意创建一个工厂确实有意义,问题是 Ron Myschuk 正在寻找一个特定的实例,而不是一个抽象类型。也许如果你更好地解释工厂方法如何帮助罗恩,人们会更倾向于支持你。 (2认同)