【问题标题】: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:) 方法存在问题。

标签: ios swift sprite-kit


【解决方案1】:

也许这会对你有所帮助:

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

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

【讨论】:

  • 人们在您投反对票时请发表评论,这将有助于 Sergey Di 和其他人从错误中吸取教训。 Sergey Di,不幸的是,工厂方法并不能真正帮助解决 Ron Myschuk 遇到的问题。现在我同意创建工厂确实有意义,问题是 Ron Myschuk 正在寻找一个特定的实例,而不是一个抽象类型。也许如果你能更好地解释工厂方法如何帮助 Ron,人们会更倾向于支持你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2015-10-11
  • 2016-01-22
  • 1970-01-01
相关资源
最近更新 更多