Swift 先声明,后下调
假设我有Swift 先声明,后下调,swift,downcast,Swift,Downcast,假设我有BaseClass,DerivedClassOne,derivedclastwo,一个神奇的工厂方法giveMeAnObjectOfType(type:String)->BaseClass,以及以下代码 func myBeautifulFunction(index: Int) -> BaseClass { let type : String = self.someArray[index] var anObject : BaseClass switch ty
BaseClass
,DerivedClassOne
,derivedclastwo
,一个神奇的工厂方法giveMeAnObjectOfType(type:String)->BaseClass
,以及以下代码
func myBeautifulFunction(index: Int) -> BaseClass {
let type : String = self.someArray[index]
var anObject : BaseClass
switch type {
case "TypeOne":
// This won't work
anObject = self.giveMeAnObjectOfType("DerivedClassOne") as! DerivedClassOne
anObject.methodOfDCOne()
case "TypeTwo":
// Neither will this
anObject = self.giveMeAnObjectOfType("DerivedClassTwo") as! DerivedClassTwo
anObject.methodOfDCTwo()
default:
// Throw a tantrum here
}
return anObject
}
这将导致错误,指出对象不包含methodofdctone()
或methodOfDCTwo()
。问题:如何正确地投射对象
基本上,我可以通过在交换机的案例中使用几个return语句来实现同样的效果,但我不喜欢这样。此外,如果我想调用基类的一些方法,我会有大量重复的代码
anObject.methodOfDCOne()
未编译,因为methodOfDCOne
不是实例方法
属于基类
(或其超类)
您必须首先创建子类类型的对象,以便可以调用子类方法。然后将对象分配(向上转换)到基类
变量:
func myBeautifulFunction(index: Int) -> BaseClass {
let type : String = self.someArray[index]
let anObject : BaseClass
switch type {
case "TypeOne":
let dc1 = self.giveMeAnObjectOfType("DerivedClassOne") as! DerivedClassOne
dc1.methodOfDCOne()
anObject = dc1
case "TypeTwo":
let dc2 = self.giveMeAnObjectOfType("DerivedClassTwo") as! DerivedClassTwo
dc2.methodOfDCTwo()
anObject = dc2
default:
// Throw a tantrum here
fatalError("Unexpected type")
}
return anObject
}
好的,这就解决了。我能从文件中读到一些特别的东西来澄清为什么会发生这种情况吗?@Morpheu5:为什么会发生这种情况?如果一个对象
被声明为基类
的一个实例,那么就不能对它调用子类方法。不,我明白了。我想我被一些我记忆不同的旧代码弄糊涂了。无论如何,谢谢:)