将对象转换为存储在变量中的类
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,人们会更倾向于支持你。以上是关于将对象转换为存储在变量中的类的主要内容,如果未能解决你的问题,请参考以下文章
当类名已知时,将 Object 类的 java 对象动态转换为给定的类