【发布时间】: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