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

Posted

技术标签:

【中文标题】将对象转换为存储在变量中的类【英文标题】:Cast object to Class stored in variable 【发布时间】:2017-06-12 15:06:08 【问题描述】:

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

我似乎能够将类类型存储在枚举中的一个变量中,但一直无法让我们这个变量将一个新对象强制转换为这个类型。

我有一个子类类型的枚举

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
        
    

我有这些游戏对象(Orange、Apple、Lemon 和 Lime)的子类,它们都继承自“Fruit”

稍后我尝试使用该变量将对象转换为该类型,但它报告错误

错误“使用未声明的类型'fruitType'

func createFruit(fruitType: FruitType, name: String) 
    if let orange = self.childNode(withName: name) as? fruitType.className 
        self.orange = orange
    
    etc...

我也尝试过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()
        
    

【问题讨论】:

做一个 as 真的没有意义吗?强制转换为直到运行时才知道的类型。您应该转换为 self.orange 的任何类型。 @dan 你说的有道理,但这不是我真正的代码。我已经简化了这个例子,以免使问题复杂化。我真正在做的是将SKS场景文件加载为基于fruitType的SKReferenceNode,我需要相应地转换该SKReferenceNode 但是为什么你需要将它转换为普通超类类型以外的任何东西呢?即使它像您在代码中一样进行转换,您也无法在转换后访问对象上的任何属性,因为编译器仍然不知道它是什么类型。 转换为父类型不会调用子类初始化器。所以它不再将它们视为“橙色”而只是水果 铸造不调用任何初始化程序。如果您的对象初始化不正确,那是因为您的 childNode(withName:) 方法存在问题。 【参考方案1】:

也许这会对你有所帮助:

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

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

【讨论】:

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

以上是关于将对象转换为存储在变量中的类的主要内容,如果未能解决你的问题,请参考以下文章

在将对象设置为参数值之前将对象变量转换为 DBType?

当类名已知时,将 Object 类的 java 对象动态转换为给定的类

如何将python中的类转换为pandas数据框?

ANDROID将存储在/res/drawable中的jpeg图像转换为位图对象[重复]

PHP:如何将对象转换为继承的类?

Block实现-block存储域